2013-11-29 8 views
14

zu meinem Wissen; Was ich tun möchte, ist in SQL nicht möglich, aber es lohnt sich, euch zu fragen.Exec gespeicherte Prozedur in dynamische Temp-Tabelle

Sagen wir, ich habe eine gespeicherte Prozedur abc, die Spalten Id und Wert zurückgibt. Diese gespeicherte Prozedur wird hauptsächlich von anderen Abteilungen aus funktionalen Gründen benutzt und ich werde sie nur gelegentlich für Datenprüfungen verwenden.

mit ihm also als Teil meiner gespeicherten Prozedur:

DECLARE @tABC TABLE 
(
    ID  INT, 
    Value DECIMAL(12,2) 
) 

INSERT INTO @tABC 
    EXEC OtherDb.DataProd.abc 

Oky so wird dies perfekt für jetzt arbeiten, aber was ist, wenn sie die Struktur ihrer gespeicherten Prozedur ändern?

Wenn Sie eine Spalte aus der gespeicherten Prozedur hinzufügen oder entfernen, wird mein Code beschädigt, und Sie können meinen Code flexibler gestalten.

Mein letzter verzweifelter Versuch ging ungefähr so:

WITH tempTable AS 
(
    EXEC OtherDb.DataProd.abc 
) 
SELECT ID, Value FROM tempTable 

die offensichtlich kläglich gescheitert.

+3

Aus diesem Grund sollten Sie Tabellenwertefunktionen oder Tabellenvariablen anstelle von gespeicherten Prozeduren verwenden, um Tabellen zurückzugeben. Wie auch immer, OPENROWSET könnte eine Lösung für Sie sein – adrianm

+0

@adrianm Ihr Kommentar zu UDFs hat mein Problem gelöst. Ich kann nicht glauben, dass ich das vorher nicht gesehen habe. – JAT

+0

mögliches Duplikat von [Ergebnisse einer gespeicherten Prozedur in eine temporäre Tabelle einfügen] (http://stackoverflow.com/questions/653714/inser-results-of-a-stored-procedure-into-a-miremporary-table) –

Antwort

8
SELECT * INTO #TempTable 
FROM OPENROWSET 
('SQLNCLI','Server=(local)\SQL2008R2;Trusted_Connection=yes;', 
    'EXEC OtherDb.DataProd.abc') 

SELECT * FROM #TempTable 
+0

Aktiviert OPENROWSET kein Sicherheitsrisiko? – JAT

+0

Bis zu einem gewissen Grad, ja. Aber es gibt keinen anderen Weg, Ihre Anforderung zu erfüllen, AFAIK – Raj

6

In eine temporäre Tabelle einfügen. Ich weiß, das funktioniert in 2008 und darüber, nicht sicher über 2005. Ihre temporäre Tabellenspalten müssen mit Ihren Stored Proc-Spalten übereinstimmen.

create table #mytable (custid int,company varchar(50),contactname varchar(50) 
       , phone varchar(50),address1 varchar(50) 
       , address2 varchar(50),city varchar(50) 
       ,st varchar(2),zip varchar(20)) 

insert into #mytable (custid,company,contactname,phone,address1,address2,city,st,zip) 
exec dbo.sp_Node_CustomerList_wService @segid = 1 

select * from #mytable 
where custid = 5 

drop table #mytable 
+0

Die Frage lautet: "Ok, das wird jetzt perfekt funktionieren, aber was ist, wenn sie die Struktur ihrer gespeicherten Prozedur ändern?" Das ist also keine gute Lösung. – CLS

+0

Ich stimme zu: Adriaan Davel Jul 20 16 um 9:15 Siehe seinen Kommentar oben. –

0

es ist besser und einfacher Weg

SELECT * INTO #tempTable FROM OPENROWSET verwenden OPENROWSET ('SQLNCLI', 'Server = localhost; Trusted_Connection = yes;', ‚EXEC OtherDb.DataProd. abc ')

+0

Bitte fügen Sie eine Beschreibung hinzu, um zu antworten. –