Ich habe eine gespeicherte Prozedur, die Zeilen zurückgibt:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
Mein eigentliches Verfahren ist etwas komplizierter, weshalb ein Sproc notwendig ist.
Ist es möglich, die Ausgabe durch Aufrufen dieser Prozedur auszuwählen?
Etwas wie:
SELECT * FROM (EXEC MyProc) AS TEMP
Ich brauche zu verwenden SELECT TOP X
, ROW_NUMBER
und eine zusätzliche WHERE
Klausel meine Daten zu Seite, und ich will nicht wirklich diese Werte als Parameter übergeben.
sql
sql-server
sql-server-2005
stored-procedures
Jonathanpeppers
quelle
quelle
Antworten:
Sie können anstelle einer Prozedur eine benutzerdefinierte Funktion oder eine Ansicht verwenden.
Eine Prozedur kann mehrere Ergebnismengen mit jeweils einem eigenen Schema zurückgeben. Es ist nicht für die Verwendung in einer
SELECT
Anweisung geeignet .quelle
Du kannst
... sql ....
quelle
INSERT #T
oderINSERT @T
ist, dass eineINSERT EXEC
Anweisung nicht verschachtelt werden kann. Wenn die gespeicherte Prozedur bereits eine enthältINSERT EXEC
, funktioniert dies nicht.Sie möchten entweder eine Tabellenwertfunktion oder fügen Ihre EXEC in eine temporäre Tabelle ein:
quelle
INSERT #T
oderINSERT @T
ist, dass eineINSERT EXEC
Anweisung nicht verschachtelt werden kann. Wenn die gespeicherte Prozedur bereits eine enthältINSERT EXEC
, funktioniert dies nicht.Sie müssen über OPENROWSET und OPENQUERY lesen
quelle
Sie müssen einen Tabellentyp deklarieren, der die gleiche Anzahl von Spalten enthält, die Ihre Speicherprozedur zurückgibt. Die Datentypen der Spalten im Tabellentyp und der von den Prozeduren zurückgegebenen Spalten sollten identisch sein
Dann müssen Sie das Ergebnis Ihrer gespeicherten Prozedur in Ihren soeben definierten Tabellentyp einfügen
Am Ende wählen Sie einfach aus Ihrem Tabellentyp
quelle
Es ist nicht erforderlich, eine temporäre Tabelle zu verwenden.
Das ist meine Lösung
quelle
sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;
Sie können die Ausgabe von sp in die temporäre Tabelle kopieren.
quelle
benutze OPENQUERY und bevor du ausführst, setze 'SET FMTONLY OFF; SET NOCOUNT ON; '
Probieren Sie diesen Beispielcode aus:
quelle
Konvertieren Sie Ihre Prozedur in eine Inline-Funktion, die eine Tabelle wie folgt zurückgibt:
Und dann können Sie es als nennen
Sie haben auch die Möglichkeit, Parameter wie folgt an die Funktion zu übergeben:
Und nenn es
quelle
Wenn 'DATA ACCESS' false ist,
nach,
Es klappt.
quelle
Mit OPENROWSET können Sie ein wenig schummeln:
Dies würde natürlich immer noch den gesamten SP ausführen.
quelle
Der Einfachheit halber und um es wieder ausführbar zu machen, habe ich ein System StoredProcedure "sp_readerrorlog" verwendet, um Daten abzurufen:
quelle
Es hört sich so an, als müssten Sie möglicherweise nur eine Ansicht verwenden . In einer Ansicht kann eine Abfrage als Tabelle dargestellt werden, sodass die Ansicht abgefragt werden kann.
quelle
Wenn Ihr Server zum Beispiel SERVERX heißt, habe ich das so gemacht ...
Um zu überprüfen, ob dies funktioniert, habe ich die
EXEC()
Befehlszeile auskommentiert und durch ersetztSELECT @CMD
, um den Befehl zu überprüfen, bevor versuchte, ihn auszuführen! Damit sollte sichergestellt werden, dass alle richtigen Anführungszeichen am richtigen Ort sind. :-)Ich hoffe das hilft jemandem.
quelle