Wie ordne ich einer SQL-Variablen ein Exec-Ergebnis zu?


108

Wie ordnen Sie das Ergebnis eines Exec-Aufrufs einer Variablen in SQL zu? Ich habe einen gespeicherten Prozess namens up_GetBusinessDay, der ein einzelnes Datum zurückgibt.

Können Sie so etwas tun:

exec @PreviousBusinessDay = dbo.up_GetBusinessDay @Date, -1

Antworten:


97

Ich verwende immer den Rückgabewert, um den Fehlerstatus zurückzugeben. Wenn Sie einen Wert zurückgeben müssen, würde ich einen Ausgabeparameter verwenden.

Beispiel einer gespeicherten Prozedur mit einem OUTPUT-Parameter:

CREATE PROCEDURE YourStoredProcedure 
(
    @Param1    int
   ,@Param2    varchar(5)
   ,@Param3    datetime OUTPUT
)
AS
IF ISNULL(@Param1,0)>5
BEGIN
    SET @Param3=GETDATE()
END
ELSE
BEGIN
    SET @Param3='1/1/2010'
END
RETURN 0
GO

Aufruf der gespeicherten Prozedur mit einem OUTPUT-Parameter:

DECLARE @OutputParameter  datetime
       ,@ReturnValue      int

EXEC @ReturnValue=YourStoredProcedure 1,null, @OutputParameter OUTPUT
PRINT @ReturnValue
PRINT CONVERT(char(23),@OutputParameter ,121)

AUSGABE:

0
2010-01-01 00:00:00.000

10
Mit einem OUTPUT-Parameter können Sie einen beliebigen Datentyp zurückgeben. Der RETURN-Wert einer gespeicherten Prozedur kann nur eine Ganzzahl sein.
KM.

2
Nur eine Randnotiz: OUTPUT-Parameter, die mit einem Wert deklariert sind, müssen nicht übergeben werden. Wenn Sie also einen vorhandenen SP ändern, können Sie dies sicher tun, ohne das Risiko einzugehen, etwas zu beschädigen. Beispiel: @ Param3 datetime = '1900-01-01' OUTPUT.
Morvael

56

Dies funktioniert, wenn Sie einfach eine Ganzzahl zurückgeben möchten:

DECLARE @ResultForPos INT 
EXEC @ResultForPos = storedprocedureName 'InputParameter'
SELECT @ResultForPos

11
-1 Dies gibt nur eine Ganzzahl zurück. Das OP möchte ein Datum zurückgeben. Die akzeptierte Antwort von @KM. ist die richtige Antwort, da OUTPUT anstelle von RETURN verwendet wird.
Code Maverick

4
Eigentlich funktioniert das. Das Beispiel, wie man eine zurückgegebene Ganzzahl erhält, kann man für alle anderen Arten tun (habe nicht geprüft, ob eine Tabelle möglich ist, aber ich denke ja.) Ich habe es nur für nvarchar (50) versucht.
Mzn

2
@Mzn "Sie können das gleiche für alle anderen Arten tun" , funktioniert sicherlich nicht mit UNIQUEIDENTIFIER.
James

1
@ James Warum? Was ist anders am Datentyp "Uniqueidentifier"? Gespeicherte Prozeduren können keine eindeutigen Kennungen zurückgeben?
Mzn

3
@Mzn UNIQUEIDENTIFIERwar nur ein Beispiel, wurde RETURNentwickelt, um nur mit ganzzahligen Werten zu arbeiten, siehe die Dokumente . Die empfohlene Methode, um andere Daten von einem SP abzurufen, besteht darin, entweder eine Ergebnismenge zurückzugeben oder zu verwendenOUTPUT
James

33
declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 

3
eigentlich die einzige Arbeitsweise, die hier beschrieben wird, abgesehen von der Änderung der Signatur des gespeicherten Prozesses
Michael Sander,

2
Wird auch für ein Datum verwendet, an dem der zugrunde liegende Sproc auch keinen Ausgabeparameter hat. (Der zugrunde liegende Sproc hatte einen weiteren Exec aus dynamischem SQL)
Jeff Beagley

3
@MichaelSander Völlig richtig, alle anderen Lösungen beantworten die OP-Frage nicht richtig. Der einzige Weg ist eine temporäre Tabelle, die die Ergebnisse enthält.
SQL Police

3
Nur so funktioniert das hier, ohne dass Änderungen am Prozess erforderlich sind, was ich in meinem Fall nicht tun kann. +1
DLeh

Sie können auch eine Tabellenvariable anstelle einer temporären Tabelle verwenden.
Fehler

6

Aus der Dokumentation (vorausgesetzt, Sie verwenden SQL-Server):

USE AdventureWorks;
GO
DECLARE @returnstatus nvarchar(15);
SET @returnstatus = NULL;
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;
PRINT @returnstatus;
GO

Also ja, es sollte so funktionieren.


8
Im Beispiel des OP, in dem ein Datum zurückgegeben werden soll, können gespeicherte Prozeduren nur einen ganzzahligen Wert an eine aufrufende Prozedur oder eine Anwendung zurückgeben.
KM.

0

Ich hatte die gleiche Frage. Obwohl es hier gute Antworten gibt, habe ich beschlossen, eine Tabellenwertfunktion zu erstellen. Mit einer Tabellen- (oder Skalar-) Wertfunktion müssen Sie Ihren gespeicherten Prozess nicht ändern. Ich habe einfach eine Auswahl aus der Tabellenwertfunktion getroffen. Beachten Sie, dass der Parameter (MyParameter ist optional).

CREATE FUNCTION [dbo].[MyDateFunction] 
(@MyParameter varchar(max))
RETURNS TABLE 
AS
RETURN 
(
    --- Query your table or view or whatever and select the results.
    SELECT DateValue FROM MyTable WHERE ID = @MyParameter;
)

Um Ihrer Variablen zuzuweisen, können Sie einfach Folgendes tun:

Declare @MyDate datetime;
SET @MyDate = (SELECT DateValue FROM MyDateFunction(@MyParameter));

Sie können auch eine skalarwertige Funktion verwenden:

CREATE FUNCTION TestDateFunction()  
RETURNS datetime  
BEGIN  
    RETURN (SELECT GetDate());
END

Dann können Sie einfach tun

Declare @MyDate datetime;
SET @MyDate = (Select dbo.TestDateFunction());
SELECT @MyDate;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.