Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menggunakan OPENQUERY (prosedur tersimpan exec) untuk membuat tabel sementara baru gagal dengan kesalahan 11526

Coba ini:

SELECT *
FROM OPENQUERY("FOO\SQL2012", 'SET FMTONLY OFF; EXEC mySchema.myStoredProc;') X;

Alasan untuk ini adalah ketika Anda menjalankan prosedur tersimpan di server tertaut, penyedia pertama-tama mencoba menentukan bentuk baris yang dihasilkan. Ini dilakukan dengan mengeluarkan SET FMTONLY ON; dan kemudian menjalankan pernyataan Anda. Dalam prosedur tersimpan yang tidak menggunakan tabel temp, ini berfungsi dengan baik. Parser kueri pada dasarnya melakukan proses kering tanpa benar-benar mengambil semua data, hanya metadata (semacam menampilkan perkiraan rencana eksekusi).

Masalahnya adalah ketika prosedur tersimpan melakukannya gunakan tabel temp, gagal, karena metadata tabel temp tidak ada:tidak dapat dikumpulkan melalui meta-analisis yang berfungsi untuk prosedur tersimpan yang tidak menggunakan tabel temp. Maka, obatnya adalah dengan SET FMTONLY OFF; dalam batch yang menjalankan prosedur tersimpan.

Ketahuilah bahwa menggunakan metode ini akan membuat prosedur tersimpan berjalan dua kali . Pertama kali mengumpulkan metadata (data dibuang), dan kedua kalinya benar-benar mengembalikan data. Jika prosedur tersimpan yang disebut sangat mahal atau memiliki efek samping, Anda mungkin perlu membuat kelonggaran.

Terakhir, perhatikan bahwa trik ini tidak bekerja pada setiap prosedur tersimpan. Ada hal-hal yang dapat dilakukan oleh prosedur tersimpan yang hanya membuang kunci pas dalam pekerjaan. Saya tidak tahu semua kemungkinannya, tetapi salah satunya adalah mengembalikan beberapa kumpulan rekaman.

Sebagai tanggapan atas pembaruan Anda bahwa SET FMTONLY OFF tidak berfungsi:dapatkah Anda merestrukturisasi SP Anda untuk tidak menggunakan tabel temp, atau menggunakan tabel permanen dengan kunci sesi? Salah satu dari opsi ini dapat melakukan pekerjaan itu. Di SQL Server 2012, Anda juga memiliki opsi untuk meneruskan data dengan tabel- parameter yang dihargai .

Anda mungkin ingin membaca Cara Berbagi Data antara Prosedur Tersimpan dari Erland Sommarskog karena dapat memberi Anda inspirasi tentang cara untuk mencapai tujuan Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana RANK() Bekerja di SQL Server

  2. Pola tunggal untuk konteks data

  3. Bagaimana membandingkan antara waktu dalam loop sementara dalam prosedur tersimpan?

  4. Apa itu WAKTU STATISTIK di SQL Server?

  5. SQL ganti semua NULL