Zkuste toto:
SELECT *
FROM OPENQUERY("FOO\SQL2012", 'SET FMTONLY OFF; EXEC mySchema.myStoredProc;') X;
Důvodem je, že při spuštění uložené procedury přes propojený server se zprostředkovatel nejprve pokusí určit tvar výsledné sady řádků. Provede to zadáním SET FMTONLY ON;
a poté spusťte svůj výpis. V uložené proceduře, která nepoužívá dočasné tabulky, to funguje krásně. Analyzátor dotazů v podstatě provádí suchý běh, aniž by ve skutečnosti načetl všechna data, pouze metadata (něco jako zobrazení odhadovaného plánu provádění).
Problém je v tom, že když uložená procedura dělá použijte dočasné tabulky, selže, protože metadata dočasné tabulky neexistují:nelze je shromáždit pomocí metaanalýzy, která funguje pro uložené procedury, které nepoužívají dočasné tabulky. Řešením je pak ruční SET FMTONLY OFF;
v dávce, která provádí uloženou proceduru.
Uvědomte si, že při použití této metody se uložená procedura spustí dvakrát . Poprvé ke shromažďování metadat (data jsou vyřazena) a podruhé ke skutečnému vrácení dat. Pokud je volaná uložená procedura obzvláště nákladná nebo má vedlejší účinky, možná budete muset provést úpravy.
Nakonec si všimněte, že tento trik nefunguje u každé uložené procedury. Jsou věci, které uložené procedury dokážou udělat, a které stačí hodit za hlavu. Neznám všechny možnosti, ale jednou z nich je vrácení více sad záznamů.
V reakci na vaši aktualizaci SET FMTONLY OFF
nefunguje:můžete případně restrukturalizovat svůj SP tak, aby nepoužíval dočasnou tabulku nebo používal trvalou tabulku s klíčem relace? Každá z těchto možností by mohla fungovat. V SQL Server 2012 máte také možnost předávat data pomocí table- hodnotné parametry
.
Možná si budete chtít přečíst Jak sdílet data mezi uloženými procedurami od Erlanda Sommarskoga protože vám může poskytnout inspiraci pro způsob, jak dosáhnout svého cíle.