2013-07-17 19 views
8

SELECT Val from storedp_Value im Abfrage-Editor von SQL Server Management Studio ist das möglich?SELECT gegen gespeicherte Prozedur SQL Server

UPDATE

Ich habe versucht, eine temporäre Tabelle zu erstellen, aber es schien nicht damit zu arbeiten, warum ich hier gefragt.

CREATE TABLE #Result 
(
batchno_seq_no int 
) 
INSERT #Result EXEC storedp_UPDATEBATCH 
SELECT * from #Result 
DROP TABLE #Result 
RETURN 

Verfahren Update

delete from batchno_seq; 
insert into batchno_seq default values; 
select @batchno_seq= batchno_seq_no from batchno_seq 
RETURN @batchno_seq 

Stored Was mache ich falsch und wie nenne ich es aus dem Abfrage-Fenster?

UPDATE # 2

Ok, würde ich Hilfe auf diese Richtung oder irgendetwas zu schätzen wissen - das ist, was zu erreichen Ich versuche.

select batchno_seq from (delete from batchno_seq;insert into batchno_seq default values; 
select * from batchno_seq) BATCHNO 
INTO TEMP_DW_EKSTICKER_CLASSIC 

Dies ist Teil einer größeren Select-Anweisung. Jede Hilfe würde sehr geschätzt werden. Im Wesentlichen ist dieses SQL gebrochen, da wir für Oracle migriert haben.

+3

Nein, das ist nicht möglich. Sie sollten Funktionen verwenden, wenn dies eine Voraussetzung ist. –

+0

@NenadZivkovic Ich muss aber löschen und einfügen, was von dem, was ich gelesen habe, ist nicht möglich. – Nate

+0

Oder Sie können 'Workaround' verwenden, indem Sie eine temporäre Tabelle erstellen, Ergebnisse aus SP darin einfügen und dann aus der temporären Tabelle auswählen. –

Antwort

11

Nun, nein. So wählen Sie aus einer gespeicherten Prozedur können Sie folgendes tun:

declare @t table (
    -- columns that are returned here 
); 

insert into @t(<column list here>) 
    exec('storedp_Value'); 

Wenn Sie die Ergebnisse aus einer gespeicherten Prozedur auf diese Weise verwenden und Sie die gespeicherte Prozedur geschrieben, ernsthaft in Erwägung ziehen, den Code zu ändern eine Ansicht zu sein, oder benutzerdefinierte Funktion. In vielen Fällen können Sie diesen Code durch ein einfacheres, besser geeignetes Konstrukt ersetzen.

5

Dies ist nicht möglich in SQL Server, können Sie die Ergebnisse in eine temporäre Tabelle einfügen und dann abfragen weiter, dass

CREATE TABLE #temp (/* columns */) 

INSERT INTO #temp (/* columns */) 
EXEC sp_MyStoredProc 

SELECT * FROM #temp 
WHERE 1=1 

DROP TABLE #temp 

Oder Sie können OPENQUERY verwenden, aber dies erfordert einen Verbindungsserver einrichten, die SQL ist

SELECT * FROM (ThisServer, 'Database.Schema.ProcedureName <params>') 
+1

Sie müssen die Spalten nicht erneut im 'INSERT INTO'-Teil wiederholen, SQL füllt die Tabelle, ohne sie explizit anzugeben. – MeanGreen

0

Versuchen Sie, diese

Change 'Return'

delete from batchno_seq; 
insert into batchno_seq default values; 
select @batchno_seq= batchno_seq_no from batchno_seq 
RETURN @batchno_seq 

auf 'Select'

delete from batchno_seq; 
insert into batchno_seq default values; 
select @batchno_seq= batchno_seq_no from batchno_seq 
SELECT @batchno_seq 
0

Mein Ansatz

select * into new_table from (select t1.col1,t1.col2,.. 
from table1 t1 
union 
select t2.cola,t2.colb,.. 
from table2 t2) as union_table 
1

Der beste Artikel (meiner Meinung nach) über alle möglichen Methoden für den Austausch von Daten zwischen gespeicherten Prozeduren in SQL Server finden Sie hier : http://www.sommarskog.se/share_data.html

0

Ich muss etwas verpassen.

Da Ihre gespeicherte Prozedur keine Ergebnismenge zurückgibt, und stattdessen gibt eine ganze Zahl, die RETURN-Funktionalität von gespeicherten Procs verwenden, können Sie einfach nicht in eine Tabelle einfügen (da es keine Ergebnismenge zurückkommt, überhaupt).

ABER, Sie können (vorausgesetzt, dass dies iterativ und nicht über eine Menge getan wird) einfach den Rückgabewert in eine lokale Variable speichern und den Wert dieser Variablen in die Tabelle einfügen, die notwendig ist.

Wenn Sie jedoch einfach den Wert in den Ergebnissen eines Abfragefensters in SSMS zurückgeben möchten, ist das INSERT und SELECTING Overkill. Es scheint mir wie folgt aus (in einem Abfragefenster) ausreichen würde:

DECLARE @RetVal INT = 0; 

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 
BEGIN TRANSACTION; 
EXEC @RetVal = storedp_UPDATEBATCH; 
COMMIT TRANSACTION; 
SELECT @RetVal; 
    --OR 
    --PRINT @RetVal; 

Wenn auf diese Weise weit weg von der Unterseite ist, bitte die DDL für „batchno_seq“ bieten, vielleicht kann ich eine bessere Unterstützung so sein.

Prost!

+0

FTR, ich stimme mit @GordonLinoff überein, in diesem Fall würde Ihre "Batch Stored Procedure" viel einfacher als Scalar UDF implementiert werden (vorausgesetzt, dass dies nicht auf ein SET wirkt) –

Verwandte Themen