Опитайте това:
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 тъй като може да ви осигури вдъхновение за начин да постигнете целта си.