Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Użycie OPENQUERY (procedura składowana exec) do utworzenia nowej tabeli tymczasowej kończy się niepowodzeniem z błędem 11526

Spróbuj tego:

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

Powodem tego jest to, że podczas wykonywania procedury składowanej na serwerze połączonym dostawca najpierw próbuje określić kształt wynikowego zestawu wierszy. Robi to, wydając SET FMTONLY ON; a następnie sporządzanie wyciągu. W procedurze składowanej, która nie używa tabel tymczasowych, działa to pięknie. Parser zapytań w zasadzie wykonuje próbę bez pobierania wszystkich danych, tylko metadanych (coś jak pokazywanie szacunkowego planu wykonania).

Problem polega na tym, że gdy procedura składowana robi użyj tabel tymczasowych, nie powiedzie się, ponieważ metadane tabeli tymczasowej nie istnieją:nie można ich zebrać za pomocą metaanalizy, która działa w przypadku procedur przechowywanych, które nie używają tabel tymczasowych. Lekarstwem jest zatem ręczne SET FMTONLY OFF; w paczce, która wykonuje procedurę składowaną.

Należy pamiętać, że użycie tej metody spowoduje, że procedura składowana uruchomi się dwukrotnie . Pierwszy raz, aby zebrać metadane (dane są odrzucane), a drugi raz, aby faktycznie zwrócić dane. Jeśli wywoływana procedura składowana jest szczególnie kosztowna lub ma skutki uboczne, może być konieczne wprowadzenie odpowiednich poprawek.

Na koniec zwróć uwagę, że ta sztuczka nie działa w przypadku każdej procedury składowanej. Są rzeczy, które mogą zrobić procedury składowane, które po prostu przeszkadzają w pracy. Nie znam wszystkich możliwości, ale jedną z nich jest zwracanie wielu zestawów rekordów.

W odpowiedzi na Twoją aktualizację SET FMTONLY OFF nie działa:czy możesz zmienić strukturę swojego SP, aby nie używał tabeli tymczasowej, lub aby użyć stałej tabeli z kluczem sesji? Każda z tych opcji może zadziałać. W SQL Server 2012 masz również możliwość przekazywania danych za pomocą table- wartościowe parametry .

Możesz przeczytać artykuł Erlanda Sommarskoga Jak udostępniać dane między przechowywanymi procedurami ponieważ może dostarczyć Ci inspiracji do osiągnięcia celu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizuj wszystkie wartości SQL NULL w wielu kolumnach za pomocą klauzuli WHERE poziomu kolumny?

  2. Znajdź TYLKO wielkie litery w słowie za pomocą zapytania w SQL Server

  3. DATEDIFF() Przykłady w SQL Server

  4. Jak znaleźć zduplikowane rekordy za pomocą klauzuli Group by i Having w SQL Server — SQL Server / TSQL Tutorial, część 132

  5. używanie typu danych datetimeoffset z jTDS