Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die Verwendung von OPENQUERY (exec gespeicherte Prozedur) zum Erstellen einer neuen temporären Tabelle schlägt mit Fehler 11526 fehl

Versuchen Sie Folgendes:

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

Der Grund dafür ist, dass der Anbieter beim Ausführen einer gespeicherten Prozedur über einen Verbindungsserver zuerst versucht, die Form des resultierenden Rowsets zu bestimmen. Dies geschieht durch Ausgabe von SET FMTONLY ON; und dann Ihre Aussage ausführen. In einer gespeicherten Prozedur, die keine temporären Tabellen verwendet, funktioniert dies wunderbar. Der Abfrageparser führt im Grunde genommen einen Trockenlauf durch, ohne tatsächlich alle Daten abzurufen, sondern nur die Metadaten (ähnlich wie einen geschätzten Ausführungsplan anzuzeigen).

Das Problem ist, dass, wenn die gespeicherte Prozedur macht Verwenden Sie temporäre Tabellen, schlägt dies fehl, da die Metadaten der temporären Tabelle nicht vorhanden sind:Sie können nicht durch die Metaanalyse erfasst werden, die für gespeicherte Prozeduren funktioniert, die keine temporären Tabellen verwenden. Das Heilmittel besteht dann darin, manuell SET FMTONLY OFF; innerhalb des Stapels, der die gespeicherte Prozedur ausführt.

Beachten Sie, dass bei Verwendung dieser Methode die gespeicherte Prozedur zweimal ausgeführt wird . Das erste Mal, um die Metadaten zu sammeln (die Daten werden verworfen), und das zweite Mal, um die Daten tatsächlich zurückzugeben. Wenn die aufgerufene gespeicherte Prozedur besonders kostspielig ist oder Nebenwirkungen hat, müssen Sie möglicherweise Zugeständnisse machen.

Beachten Sie schließlich, dass dieser Trick nicht bei jeder gespeicherten Prozedur funktioniert. Es gibt Dinge, die gespeicherte Prozeduren tun können, die einfach einen Schraubenschlüssel in die Arbeit werfen. Ich kenne nicht alle Möglichkeiten, aber eine davon gibt mehrere Recordsets zurück.

Als Reaktion auf Ihre Aktualisierung, die SET FMTONLY OFF funktioniert nicht:Können Sie möglicherweise Ihren SP so umstrukturieren, dass er keine temporäre Tabelle verwendet oder eine permanente Tabelle mit Sitzungsschlüsseln verwendet? Jede dieser Optionen könnte die Arbeit erledigen. In SQL Server 2012 haben Sie auch die Möglichkeit, Daten mit table- Wertparameter .

Vielleicht möchten Sie Erland Sommarskogs How to Share Data between Stored Procedures lesen da es Sie inspirieren könnte, wie Sie Ihr Ziel erreichen können.