sql >> Databáze >  >> RDS >> Sqlserver

Použití OPENQUERY (exec uložená procedura) k vytvoření nové dočasné tabulky se nezdaří s chybou 11526

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.



  1. aktualizujte jedinečný indexovaný sloupec v mysql

  2. Pandas 0.20.2 to_sql() pomocí MySQL

  3. MySQL 5:Záleží na tom, v jakém pořadí jsou pole GROUP BY?

  4. Jak zkontrolovat, zda je sloupec virtuální v Oracle?