Bir sql değişkenine bir exec sonucu nasıl atanır?


108

Bir exec çağrısının sonucunu SQL'deki bir değişkene nasıl atarsınız? up_GetBusinessDayTek bir tarih döndüren kayıtlı bir işlemim var .

Bunun gibi bir şey yapabilir misin:

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

Yanıtlar:


97

Hata durumunu geri almak için her zaman dönüş değerini kullanırım. Bir değeri geri vermeniz gerekirse, bir çıktı parametresi kullanırdım.

ÇIKIŞ parametresi ile örnek saklı prosedür:

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

ÇIKIŞ parametresiyle saklı yordamı çağırın:

DECLARE @OutputParameter  datetime
       ,@ReturnValue      int

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

ÇIKTI:

0
2010-01-01 00:00:00.000

10
ÇIKIŞ parametresi kullanarak, herhangi bir veri türünü geri döndürebilirsiniz, saklı yordamdan RETURN değeri yalnızca bir tam sayı olabilir.
KM.

2
Sadece bir ek not, bir değerle bildirilen OUTPUT parametrelerinin aktarılmasına gerek yoktur. Bu, mevcut bir SP'yi değiştiriyorsanız, herhangi bir şeyi bozmadan bunu güvenli bir şekilde yapabileceğiniz anlamına gelir. örneğin, @ Param3 datetime = '1900-01-01' OUTPUT.
Morvael

55

Bu, bir tam sayı döndürmek isterseniz işe yarar:

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

13
-1 Bu yalnızca bir tamsayı döndürür. OP bir tarih vermek istiyor. @KM tarafından kabul edilen cevap. RETURN yerine OUTPUT kullandığından doğru cevaptır.
Code Maverick

4
Aslında bu işe yarıyor. Döndürülen bir tamsayının nasıl alınacağına dair örnek, diğer tüm türler için aynısını yapabilirsiniz (tablo mümkün mü kontrol etmedim, ama evet düşünüyorum.) Ben sadece nvarchar (50) için denedim.
Mzn

2
@Mzn "diğer türler için aynısını yapabilirsiniz" , kesinlikle çalışmıyor UNIQUEIDENTIFIER.
James

1
@James Neden? Benzersiz tanımlayıcı veri türünün farkı nedir? Saklanan prosedürler benzersiz tanımlayıcıları döndüremez mi?
Mzn

3
@Mzn UNIQUEIDENTIFIERsadece bir örnektir, RETURNyalnızca tamsayı değerleriyle çalışmak üzere tasarlanmıştır, dokümanlara bakın . Bir SP'den diğer verileri almanın önerilen yolu, bir sonuç kümesi döndürmek veya kullanmaktırOUTPUT
James

34
declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 

3
aslında depolanan işlemcinin imzasını değiştirmek dışında burada açıklanan tek çalışma yolu
Michael Sander

2
Bunu, temeldeki Sproc'un da bir çıktı parametresine sahip olmadığı bir tarih için kullandı. (Temel sproc, dinamik
SQL'den

3
@MichaelSander Tamamen doğru, diğer tüm çözümler OP'lerin sorusuna doğru yanıt vermiyor . Tek yol, sonuçları tutan geçici bir tablodur.
SQL Police

3
Benim durumumda yapamadığım, proc düzenlemeleri gerektirmeden burada işe yarayan tek yol. +1
DLeh

Geçici tablo yerine bir tablo değişkeni de kullanabilirsiniz.
hata

6

Gönderen belgelerinde (SQL-Server kullanmak varsayarak):

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

Yani evet, bu şekilde çalışmalı.


8
OP'nin örneğinde bir tarih döndürmek istediklerinde, Saklanan prosedürler yalnızca bir çağırma prosedürüne veya bir uygulamaya bir tamsayı değeri GERİ DÖNÜYOR.
KM.

0

Ben de aynı soruyu sordum. Burada iyi cevaplar olsa da, tablo değerli bir fonksiyon oluşturmaya karar verdim. Tablo (veya skaler) değerli bir işlevle, depolanan proc'unuzu değiştirmeniz gerekmez. Tablo değerli işlevden basitçe bir seçim yaptım. Parametrenin (MyParameter isteğe bağlıdır) olduğunu unutmayın.

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;
)

Değişkeninize atamak için aşağıdaki gibi bir şey yapabilirsiniz:

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

Ayrıca skaler değerli bir işlev de kullanabilirsiniz:

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

O zaman basitçe yapabilirsin

Declare @MyDate datetime;
SET @MyDate = (Select dbo.TestDateFunction());
SELECT @MyDate;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.