Prova detta:
SELECT *
FROM OPENQUERY("FOO\SQL2012", 'SET FMTONLY OFF; EXEC mySchema.myStoredProc;') X;
Anledningen till detta är att när du kör en lagrad procedur över en länkad server, försöker leverantören först bestämma formen på den resulterande raduppsättningen. Den gör detta genom att utfärda SET FMTONLY ON;
och kör sedan ditt uttalande. I en lagrad procedur som inte använder temp tabeller fungerar detta vackert. Frågeparsern gör i princip en torrkörning utan att faktiskt hämta all data, bara metadata (som att visa en beräknad exekveringsplan).
Problemet är att när den lagrade proceduren gör använd temp-tabeller, det misslyckas, eftersom temp-tabellens metadata inte existerar:det kan inte samlas in genom metaanalysen som fungerar för lagrade procedurer som inte använder temp-tabeller. Botemedlet är alltså att manuellt SET FMTONLY OFF;
inom den batch som utför den lagrade proceduren.
Tänk på att om du använder den här metoden kommer den lagrade proceduren att köras två gånger . Första gången för att samla in metadata (data som kasseras), och andra gången för att faktiskt returnera data. Om den anropade lagrade proceduren är särskilt kostsam eller har biverkningar kan du behöva ta hänsyn.
Slutligen, notera att det här tricket inte fungerar på varje lagrad procedur. Det finns saker som lagrade procedurer kan göra som bara kastar en skiftnyckel i arbetet. Jag känner inte till alla möjligheter, men en av dem är att returnera flera postuppsättningar.
Som svar på din uppdatering att SET FMTONLY OFF
fungerar inte:kan du möjligen omstrukturera din SP så att den inte använder en temporär tabell, eller att använda en permanent tabell med sessionsnyckel? Båda dessa alternativ skulle kunna göra jobbet. I SQL Server 2012 har du också möjlighet att skicka runt data med tabell- värderade parametrar
.
Du kanske vill läsa Erland Sommarskogs Hur man delar data mellan lagrade procedurer eftersom det kan ge dig inspiration till ett sätt att uppnå ditt syfte.