Как присвоить результат выполнения переменной sql?

108

Как присвоить результат вызова exec переменной в SQL? У меня есть хранимая процедура up_GetBusinessDay, которая возвращает одну дату.

Вы можете сделать что-нибудь вроде этого:

exec @PreviousBusinessDay = dbo.up_GetBusinessDay @Date, -1
Прабху
источник

Ответы:

97

Я всегда использую возвращаемое значение, чтобы передать статус ошибки. Если вам нужно передать одно значение, я бы использовал выходной параметр.

образец хранимой процедуры с параметром OUTPUT:

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

вызов хранимой процедуры с параметром OUTPUT:

DECLARE @OutputParameter  datetime
       ,@ReturnValue      int

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

ВЫВОД:

0
2010-01-01 00:00:00.000
КМ.
источник
10
Используя параметр OUTPUT, вы можете вернуть любой тип данных, значение RETURN из хранимой процедуры может быть только целым числом.
КМ.
2
Замечание: параметры OUTPUT, которые объявлены со значением, не нужно передавать. Это означает, что если вы изменяете существующий SP, вы можете сделать это безопасно, не рискуя что-либо сломать. например, @ Param3 datetime = '1900-01-01' ВЫХОД.
Морваэль,
55

Это сработает, если вы хотите просто вернуть целое число:

DECLARE @ResultForPos INT 
EXEC @ResultForPos = storedprocedureName 'InputParameter'
SELECT @ResultForPos
Сиддхеш Бондре
источник
13
-1 Это вернет только целое число. ОП хочет вернуть дату. Принятый ответ @KM. - правильный ответ, поскольку он использует ВЫХОД вместо ВОЗВРАТА.
Code Maverick
4
На самом деле это работает. Пример того, как получить возвращаемое целое число, вы можете сделать то же самое для всех других типов (не проверял, возможна ли таблица, но я думаю, что да). Я просто попробовал это для nvarchar (50).
Mzn
2
@Mzn "вы можете сделать то же самое для всех других типов" , конечно, не работает UNIQUEIDENTIFIER.
Джеймс
1
@ Джеймс Почему? Чем отличается тип данных uniqueidentifier? Хранимые процедуры не могут возвращать уникальные идентификаторы?
Mzn 09
3
@Mzn UNIQUEIDENTIFIERбыл просто примером, RETURNпредназначен для работы только с целыми значениями, см. Документацию . Рекомендуемый способ получения других данных от SP - либо вернуть набор результатов, либо использоватьOUTPUT
Джеймс
34
declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 
Аризона Чад
источник
3
на самом деле единственный рабочий способ, описанный здесь, кроме изменения подписи сохраненного процесса
Майкл Сандер
2
Используется также для даты, когда базовый Sproc также не имеет выходного параметра. (В базовом sproc был еще один Exec из динамического SQL)
Джефф Бигли
3
@MichaelSander Полностью правильно, все другие решения не правильно ответить на вопрос OPS. Единственный способ - это временная таблица, в которой хранятся результаты.
SQL Police
3
Единственный способ, который здесь работает, не требуя правок в процедуре, чего я не могу сделать в моем случае. +1
DLeh
Вы также можете использовать табличную переменную вместо временной таблицы.
ошибка
6

Из документации (при условии, что вы используете SQL-Server):

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

Так что да, так должно работать.

Питер Лэнг
источник
8
в примере OP они хотят вернуть дату. Хранимые процедуры могут возвращать только целочисленное значение вызывающей процедуре или приложению.
КМ.
0

У меня такой же вопрос. Хотя здесь есть хорошие ответы, я решил создать функцию с табличным значением. С функцией с табличным (или скалярным) значением вам не нужно изменять сохраненную процедуру. Я просто сделал выбор из функции с табличным значением. Обратите внимание, что параметр (MyParameter не является обязательным).

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

Чтобы назначить свою переменную, вы просто можете сделать что-то вроде:

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

Вы также можете использовать скалярную функцию:

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

Тогда вы можете просто сделать

Declare @MyDate datetime;
SET @MyDate = (Select dbo.TestDateFunction());
SELECT @MyDate;
CodeCaptain
источник