Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използването на OPENQUERY (съхранена процедура exec) за създаване на нова временна таблица е неуспешно с грешка 11526

Опитайте това:

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

Причината за това е, че когато изпълнявате съхранена процедура през свързан сървър, доставчикът първо се опитва да определи формата на резултантния набор от редове. Той прави това чрез издаване на SET FMTONLY ON; и след това изпълнявате вашето изявление. В съхранена процедура, която не използва временни таблици, това работи прекрасно. Синтаксичният анализатор на заявки по същество прави сухо изпълнение, без всъщност да извлича всички данни, само метаданните (нещо като показване на приблизителен план за изпълнение).

Проблемът е, че когато съхранената процедура прави използва временни таблици, не успява, защото метаданните на временната таблица не съществуват:не могат да бъдат събрани чрез мета-анализ, който работи за съхранени процедури, които не използват временни таблици. Лечението тогава е ръчно SET FMTONLY OFF; в рамките на пакета, който изпълнява съхранената процедура.

Имайте предвид, че използването на този метод ще накара съхранената процедура да се изпълнява два пъти . Първият път за събиране на метаданните (данните се отхвърлят) и вторият път за действително връщане на данните. Ако извиканата съхранена процедура е особено скъпа или има странични ефекти, може да се наложи да направите резерви.

И накрая, имайте предвид, че този трик не работи на всяка съхранена процедура. Има неща, които съхранените процедури могат да направят, които просто хвърлят гаечен ключ в работата. Не знам всички възможности, но една от тях е връщането на множество набори от записи.

В отговор на вашата актуализация, че SET FMTONLY OFF не работи:можете ли евентуално да преструктурирате своя SP, за да не използвате временна таблица или да използвате постоянна таблица със сесиен ключ? Всяка от тези опции може да свърши работа. В SQL Server 2012 имате също възможността да предавате данни с table- стойностни параметри .

Може да искате да прочетете Как да споделяте данни между съхранени процедури на Erland Sommarskog тъй като може да ви осигури вдъхновение за начин да постигнете целта си.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sql актуализиране на int колона въз основа на предишна int колона

  2. Как мога да конвертирам функцията за разделяне във вградена таблица със стойност udf в SQL сървър?

  3. Използване на COALESCE в SQL изглед

  4. Хеширане на повече от 8000 байта в SQL Server

  5. Как да се ПРИСЪЕДИНЯ към трета таблица в моя SQL израз, който връща COUNT, без да загубя 0 броя елементи?