2016-08-05 2 views
1

Ich habe eine gespeicherte Prozedur, die ein Ergebnis zurückgibt, sagen wir, es gibt Zeilen von Produkten zurück. Aber jeder Produktstatus ist nicht in unserer Hand (kann es nicht bekommen). Unser DBA hat uns gerade eine andere gespeicherte Prozedur gegeben, um den Status eines Produkts zu erhalten. Wir müssen den individuellen Produktstatus erreichen, indem wir ihren SP aufrufen. Lassen Sie uns sagen, dass wir Produkt Tisch haben,Erhalte eine bestimmte Spalte von einem zurückgegebenen Ergebnis von SP?

CREATE TABLE PRODUCTS 
(
    ID INT, 
    Name NVARCHAR(100) 
) 

CREATE PROCEDURE GetProducts 
AS 
BEGIN 
     INSERT INTO #TEMPTABLE 
     SELECT * FROM PRODUCTS; -- Yes Too Much simplified 

     -- Create cursor and set additional status in #TEMPTABLE 

END; 

EXEC GetStatus @ProductId; -- SP That need to get status 

Das Problem ist, dass GetStatus einzige Weg ist, um den Status zu erhalten und diese manchmal 2 Spalten sp zurückkehren, manchmal 4 und manchmal 8. Die Rückkehr Spalten wird immer auch Statusspalte sicher .

Wenn Spaltennamen festgelegt ist, gibt es kein Problem. Gibt es eine Möglichkeit, eine dynamische Tabelle zum Zeitpunkt der Ausführung von SP zu erstellen.

dies versucht, aber nicht funktioniert,

WITH DynamicTable AS 
(
    EXEC GetStatus 
) 
+0

Siehe die oberen zwei Antworten hier: http://stackoverflow.com/questions/653714/inser-results-of-a-stored-procedure-into-a-merminal-table – Nicarus

+0

@Nicarus OPENROWSET ist nicht in unserer aktiviert Server :( – user960567

+0

Die Verwendung von Cursors und #temptable innerhalb eines gespeicherten Proc ist wahrscheinlich ein weiteres Zeichen, dass Ihr DBA nicht den Aufgaben gewachsen ist – Twelfth

Antwort

3

Die Antwort auf Ihre Frage lautet: Nein. Es gibt keine gute Weise, um den Wert einer bestimmten Spalte zu erhalten, die von einer gespeicherten Prozedur zurückgegeben wird, die eine dynamische Gruppe von Spalten zurückgeben kann.

Ich sage nicht "gut" Weg, denn natürlich gibt es einen Weg. Sie können eine INSERT EXEC-Anweisung für jede mögliche Spaltengruppe schreiben, die die Prozedur zurückgeben und in einen TRY..CATCH-Block umbrechen kann. Wenn der erste Fehler auftritt, versuchen Sie den nächsten. Sobald Sie einen Fehler haben, erhalten Sie den Status und den Rest.

Das ist die Antwort auf Ihre Frage. Die Lösung für Ihr Problem besteht jedoch darin, die gespeicherte GetStatus-Prozedur durch eine Tabellenwertfunktion zu ersetzen. Dann können Sie daraus auswählen, sich daran anschließen, usw. Ich denke, die Funktion müsste immer eine konsistente Anzahl von Spalten zurückgeben, aber das wäre sowieso besser, und die Spalten, die in einem bestimmten Fall nicht benötigt werden, könnten einfach sein leer gelassen oder NULL.

+0

Ich mag das Umschreiben, um die gleiche Anzahl von Spalten viel zurückzugeben. Wenn es eine gemeinsame Spalte gibt, erwarten wir 12 Spalten in der neuen Tabelle (1+ (2-1) + (4-1) + (8-1)) – Hogan

+0

@Hogan (und Tab) Hatte SQL einen Tabellentyp mit dynamische Spalten. Wie in dynamischen Sprachen Python, Js, C# (dynamisches Schlüsselwort), Ruby? – user960567

+1

Es gibt in SQL Server keine Möglichkeit, einen Tabellentyp mit dynamischen Spalten zu deklarieren, aber Sie können ihn deklarieren und dann ÄNDERN, wenn die Umstände dies erfordern. Ich weiß jedoch nicht, ob Sie die Tabelle ändern können, die von einer TVF ausgegeben wird, weshalb ich sage, dass ich denke, dass die Funktion eine konsistente Reihe von Spalten haben müsste. –

Verwandte Themen