Як призначити результат exec змінної 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' ВИХІД.
Morvael

55

Це спрацює, якщо ви хочете просто повернути ціле число:

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

13
-1 Це поверне лише ціле число. ОП хоче повернути дату. Прийнята відповідь від @KM. є правильною відповіддю, оскільки він використовує OUTPUT замість RETURN.
Code Maverick

4
Насправді це працює. Приклад, як отримати ціле число, яке повертається, ви можете зробити те ж саме для всіх інших видів (не перевіряв, чи можлива таблиця, але я думаю, що так.) Я просто спробував це для nvarchar (50).
Mzn

2
@Mzn "Ви можете зробити те ж саме для всіх інших видів" , звичайно, не працює UNIQUEIDENTIFIER.
Джеймс

1
@James Чому? Що відрізняється від типу даних унікального ідентифікатора? Збережені процедури не можуть повернути унікальні ідентифікатори?
Мзн

3
@Mzn UNIQUEIDENTIFIERбув лише прикладом, RETURNпризначений для роботи лише з цілими значеннями, дивіться документи . Рекомендований спосіб отримання інших даних з СП є або повертати результуючий набір або використанняOUTPUT
Джеймс

34
declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 

3
насправді єдиний робочий спосіб тут описаний, окрім зміни збереженого підпису Proc
Майкла Сандера

2
Використовується це також для дати, коли базовий Sproc також не має вихідного параметра. (У базового парока був ще один Exec всередині нього з динамічного SQL)
Джефф Біглі

3
@MichaelSander Повністю правильно, всі інші рішення НЕ правильно відповісти на питання OPS. Єдиний спосіб - це тимчасова таблиця, в якій зберігаються результати.
SQL Police

3
Єдиний спосіб, який працює тут, не вимагаючи змін до процесора, чого я не можу зробити у своєму випадку. +1
DLeh

Ви також можете використовувати змінну таблиці замість темп-таблиці.
помилка

6

З документації (якщо використовувати SQL-сервер):

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

Так що так, це має працювати саме так.


8
у прикладі ОП вони хочуть повернути дату. Збережені процедури можуть ВІДНОВИТИ ціле значення лише для процедури виклику або програми.
КМ.

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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.