Saya memiliki tiga prosedur tersimpan Sp1
, Sp2
dan Sp3
.
Yang pertama ( Sp1
) akan mengeksekusi yang kedua ( Sp2
) dan menyimpan data yang dikembalikan ke @tempTB1
dan yang kedua akan mengeksekusi yang ketiga ( Sp3
) dan menyimpan data ke @tempTB2
.
Jika saya menjalankannya, Sp2
itu akan berfungsi dan itu akan mengembalikan semua data saya dari Sp3
, tetapi masalahnya ada di Sp1
, ketika saya menjalankannya, itu akan menampilkan kesalahan ini:
Pernyataan INSERT EXEC tidak dapat disarangkan
Saya mencoba untuk mengubah tempat execute Sp2
dan itu menampilkan saya kesalahan lain:
Tidak dapat menggunakan pernyataan ROLLBACK dalam pernyataan INSERT-EXEC.
sp_help_jobactivity
).Ini adalah satu-satunya cara "sederhana" untuk melakukan ini di SQL Server tanpa beberapa fungsi besar yang dibuat berbelit-belit atau panggilan string sql yang dijalankan, keduanya merupakan solusi yang buruk:
CONTOH:
Catatan : Anda HARUS menggunakan 'set fmtonly off', DAN Anda TIDAK DAPAT menambahkan sql dinamis ke ini baik di dalam panggilan openrowset, baik untuk string yang berisi parameter prosedur tersimpan Anda atau untuk nama tabel. Itulah mengapa Anda harus menggunakan tabel temp daripada variabel tabel, yang akan lebih baik, karena tabel temporer dalam banyak kasus.
sumber
Oke, didorong oleh jimhark berikut ini contoh pendekatan tabel hash tunggal lama: -
sumber
Pekerjaan saya untuk masalah ini selalu menggunakan prinsip bahwa tabel temporer hash tunggal berada dalam ruang lingkup untuk setiap procs yang disebut. Jadi, saya memiliki opsi sakelar di parameter proc (default disetel ke nonaktif). Jika ini diaktifkan, proc yang dipanggil akan memasukkan hasilnya ke dalam tabel temp yang dibuat di proc pemanggil. Saya pikir di masa lalu saya telah mengambil langkah lebih jauh dan meletakkan beberapa kode dalam proc yang dipanggil untuk memeriksa apakah tabel hash tunggal ada dalam ruang lingkup, jika tidak maka masukkan kode, jika tidak kembalikan set hasil. Tampaknya berfungsi dengan baik - cara terbaik untuk meneruskan kumpulan data besar antarprocs.
sumber
Trik ini berhasil untuk saya.
Anda tidak mengalami masalah ini di server jarak jauh, karena di server jarak jauh, perintah penyisipan terakhir menunggu hasil dari perintah sebelumnya untuk dieksekusi. Ini tidak terjadi di server yang sama.
Dapatkan untung dari situasi itu sebagai solusi.
Jika Anda memiliki izin yang tepat untuk membuat Server Tertaut, lakukanlah. Buat server yang sama dengan server tertaut.
sekarang perintah Sql Anda di SP1 adalah
Percayalah, ini berfungsi bahkan Anda memiliki sisipan dinamis di SP2
sumber
Saya menemukan solusi untuk mengubah salah satu prods menjadi fungsi nilai tabel. Saya menyadari itu tidak selalu mungkin, dan memperkenalkan keterbatasannya sendiri. Namun, saya selalu dapat menemukan setidaknya satu prosedur sebagai kandidat yang baik untuk ini. Saya suka solusi ini, karena tidak ada "peretasan" untuk solusi tersebut.
sumber
Saya mengalami masalah ini saat mencoba mengimpor hasil Proc Tersimpan ke dalam tabel temporer, dan Proc Tersimpan itu dimasukkan ke dalam tabel temporer sebagai bagian dari operasinya sendiri. Masalahnya adalah bahwa SQL Server tidak mengizinkan proses yang sama untuk menulis ke dua tabel temp yang berbeda pada waktu yang sama.
Jawaban OPENROWSET yang diterima berfungsi dengan baik, tetapi saya harus menghindari penggunaan SQL Dinamis atau penyedia OLE eksternal dalam proses saya, jadi saya memilih rute yang berbeda.
Satu solusi mudah yang saya temukan adalah mengubah tabel sementara dalam prosedur tersimpan saya menjadi variabel tabel. Ia bekerja persis sama seperti yang dilakukannya dengan tabel temp, tetapi tidak lagi bertentangan dengan sisipan tabel temp saya yang lain.
Hanya untuk menghadang komentar saya tahu bahwa beberapa dari Anda akan menulis, peringatan me off Tabel Variabel sebagai pembunuh kinerja ... Yang bisa saya katakan kepada Anda adalah bahwa pada tahun 2020 itu membayar dividen tidak perlu takut Tabel Variabel. Jika ini tahun 2008 dan Database saya di-host di server dengan RAM 16GB dan menjalankan HDD 5400RPM, saya mungkin setuju dengan Anda. Tapi ini tahun 2020 dan saya memiliki array SSD sebagai penyimpanan utama saya dan ratusan pertunjukan RAM. Saya dapat memuat seluruh database perusahaan saya ke variabel tabel dan masih memiliki banyak RAM tersisa.
Variabel Tabel kembali ke menu!
sumber
Saya memiliki masalah dan kekhawatiran yang sama tentang kode duplikat di dua atau lebih sprocs. Saya akhirnya menambahkan atribut tambahan untuk "mode". Ini memungkinkan kode umum ada di dalam satu sproc dan aliran yang diarahkan mode serta kumpulan hasil dari sproc.
sumber
bagaimana dengan hanya menyimpan output ke tabel statis? Suka
ini tidak ideal, tetapi sangat sederhana dan Anda tidak perlu menulis ulang semuanya.
UPDATE : solusi sebelumnya tidak berfungsi dengan baik dengan query paralel (async dan multiuser accessing) oleh karena itu sekarang saya menggunakan tabel temp
spGetData
konten prosedur tersimpan bersarangsumber
Deklarasikan variabel kursor output ke bagian dalam sp:
Kemudian nyatakan kursor cursor untuk memilih yang ingin Anda kembalikan. Lalu buka kursornya. Kemudian atur referensinya:
JANGAN menutup atau mengalokasikan ulang.
Sekarang panggil sp bagian dalam dari bagian luar yang memasok parameter kursor seperti:
Setelah sp bagian dalam dijalankan, Anda
@cOUT
siap untuk mengambil. Putar ulang, lalu tutup dan alokasikan.sumber
Jika Anda dapat menggunakan teknologi terkait lainnya seperti C #, saya sarankan menggunakan perintah SQL bawaan dengan parameter Transaksi.
Saya telah membuat Aplikasi Konsol sederhana yang menunjukkan kemampuan ini yang dapat ditemukan di sini: https://github.com/hecked12/SQL-Transaction-Using-C-Sharp
Singkatnya, C # memungkinkan Anda untuk mengatasi batasan ini di mana Anda dapat memeriksa keluaran dari setiap prosedur tersimpan dan menggunakan keluaran tersebut sesuka Anda, misalnya Anda dapat memasukkannya ke prosedur tersimpan lainnya. Jika hasilnya baik-baik saja, Anda dapat melakukan transaksi, jika tidak, Anda dapat mengembalikan perubahan menggunakan rollback.
sumber
Di SQL Server 2008 R2, saya mengalami ketidakcocokan di kolom tabel yang menyebabkan galat Rollback. Itu hilang ketika saya memperbaiki variabel tabel sqlcmd saya yang diisi oleh pernyataan insert-exec agar sesuai dengan yang dikembalikan oleh proc yang disimpan. Org_code hilang. Dalam file cmd windows, itu memuat hasil dari prosedur yang disimpan dan memilihnya.
sumber