2009-07-16 7 views
3

In SQL Server, gibt es keine Möglichkeit, eine temporäre Tabelle im Fluge aus den Ergebnissen einer gespeicherten Prozedur, ala zu erstellen:Funktionaler Grund, warum gespeicherte Prozeduren INSERT/EXECUTE INTO nicht unterstützen?

CREATE TABLE #temptable AS 
EXEC spMyStoredProc 

oder

EXEC spMyStoredProc INTO #temptable 

oder so etwas. Stattdessen müssen Sie vorher das SP-Layout wissen, und haben so etwas zu tun:

CREATE TABLE #temptable (col1 INT, col2 VARCHAR(255)) 

INSERT INTO #temptable 
EXEC spMyStoredProc 

Gibt es einen funktionalen Grund, warum dies der Fall ist? Vielleicht eine Einschränkung von SQL Server? Oder ist es nur etwas, das noch nicht zur SQL-Spezifikation hinzugefügt wurde, und ich kann hoffen, dass es eines Tages unterstützt wird?

+0

Bitte verwenden Sie "SQL-Server" tag ... – gbn

Antwort

10

Eine gespeicherte Prozedur kann viele Ergebnismengen oder keine zurückgeben, und sie kann je nach Ausführung der gespeicherten Prozedur vollständig variieren.

Wenn es kompiliert ist, beschreibt es die Meta-Information nicht als eine bestimmte expectable Resultset-Ausgabe.

Ich erwarte angesichts dieser Einschränkungen, sie beschlossen, dies nicht zu implementieren, weil es nicht stark typisiert, was eine gespeicherte Prozedur zurückgeben kann.

+0

Ich kann sehen, warum sie dies nicht implementieren würden, aber es gibt eine Reihe von Möglichkeiten, um das Rückkehrschema eines SP in VB oder C# zu erhalten, also würde ich denken, das gleiche würde hier gelten. Ich nehme an, ein unberechenbares Ergebnistabellenformat ist weniger als ideal, aber es scheint immer noch etwas zu sein, was Sie tun können, da es viele andere, weniger vorhersagbare Dinge gibt, die Sie in T-SQL machen dürfen. Wie auch immer, danke für deine Einsicht! – SqlRyan

+0

Cool - keine Probleme, Sie müssen daran denken, obwohl das Verhalten und die anfängliche Implementierung weit zurück in das Jahr 1995 und davor gehen, als Microsoft den Sybase-Quellcode kaufte. Zurück in dem Tag, was Sie reden, war ein bisschen mehr Arbeit, wenn Sie es in C schreiben, anstatt eine höhere Sprache wie .NET oder VB! Daher minimalistische Einschränkungen wie diese! :) –

0

Nicht von einem Sproc, aber Sie können Tabellenwerte verwenden, um etwas ähnliches zu tun.

Select * From fnMyFunction 

Sie könnten in eine # Tabelle einfügen, wenn Sie möchten.

+0

Ich habe zuvor Tabellen-basierte UDFs verwendet, aber sie unterstützen eine Reihe von Dingen nicht, die SPs tun, wie Entscheidungen basierend auf dem Datum zu treffen. Und wenn ein bestehendes System mit SPs gebaut wird, kann ich nichts dagegen tun. Ich habe mich immer gefragt, warum SPs genau das nicht unterstützen, was Sie mit UDFs beschreiben. – SqlRyan

+1

Fair genug. Ich lasse die Antwort, wenn es einem zukünftigen Googler hilft. – NikolaiDante

+0

Ich bin mir nicht sicher, was der allgemeine Konsens ist, aber ich bin fast nie dafür, eine Antwort zu löschen - auch wenn es mir nicht hilft, wird es bestimmt jemanden in der Zukunft helfen. Danke für Ihre Hilfe, vor allem, weil es für mich mehr Kopfzerbrechen bereitet, als nach einer tatsächlichen Lösung zu suchen, da ich glaube, dass es keine gibt. – SqlRyan

0

Try this

DECLARE @temptable TABLE (ID INT, NAME VARCHAR(255)) 

declare @query varchar(max) 

set @query='Select whatever from whereever' 

INSERT INTO @temptable 

EXEC (@Query) 

select *from @temptable 
0

out Wenn ich eine solche Funktionalität brauchte ich eine Inline-UDF wie folgt verwenden würde:

CREATE PROCEDURE MySample 
AS 
SELECT a,b,c FROM dbo.MyInlineUDF(1,2,3) 
GO 

SELECT * INTO #t 
FROM dbo.MyInlineUDF(1,2,3) WHERE 1=0 

INSERT INTO #t EXEC MySample 
Verwandte Themen