Почему выходные данные этого простого процесса изменяют типы данных? - PullRequest
1 голос
/ 09 июня 2011

При тестировании выходных значений из procs, почему конечный select @TestValOut возвращает 0 вместо null или пустую строку?

Я понимаю, что правильный способ сделать это - использовать OUTPUT параметры, поэтому вопрос действительно становится следующим: Почему тип данных установленного значения @TestValOut при выполнении является целым числом?

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'Custom.test') AND type in (N'P', N'PC'))
    DROP PROCEDURE Custom.test
GO

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1
    )
As
    Declare @TestValIn varchar(max)
    select @TestValIn='asdf'

GO

BEGIN TRAN

    Declare @TestValOut varchar(max)
    set @TestValOut='ffff'
    Exec @TestValOut=Custom.test @CurrentUserID=1
    select @TestValOut
ROLLBACK

Ответы [ 4 ]

4 голосов
/ 09 июня 2011

Возвращаемое значение в хранимой процедуре всегда является целым числом, фактически вы можете использовать только целое число с возвращаемым значением. Тот факт, что вы видите 0, означает, что процедура выполняется правильно, это возвращаемое значение, которое возвращает SQL Server, сообщая вам, каков результат выполнения процедуры

Ради интереса сделайте select 1/0 в процедуре, и вы увидите, что больше не будет 0

Смотрите здесь

Всегда ли возвращаемое значение 0 является успешным в хранимых процедурах?

вот примеры из этого ответа

CREATE PROC pr_test AS 
SELECT 1/0

RETURN 0
GO

Теперь запустите

DECLARE @i INT
exec @i = pr_test

SELECT @i  -- will be 0

DROP PROC pr_test

Теперь давайте сделаем это снова без оператора return

CREATE PROC pr_test2 AS 
SELECT 1/0

GO

DECLARE @i INT
exec @i = pr_test2

SELECT @i  -- will be - 6

Лучше использовать output parameter для передачи назад статусов и / или сообщений

2 голосов
/ 09 июня 2011

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

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1,
    @TestValOut varchar(max) OUTPUT
    )
As
    select @TestValOut='asdf'

GO

BEGIN TRAN    
    Declare @TestValOut varchar(max)
    Exec Custom.test @CurrentUserID=1, @TestValOut OUTPUT
    select @TestValOut
ROLLBACK
1 голос
/ 09 июня 2011

@ TestValOut присваивается значение, которое будет возвращать с помощью "ВОЗВРАТА", как это:

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1
    )
As
    Declare @TestValIn varchar(max)
    select @TestValIn='asdf'

RETURN --defaults to zero, this is the value
GO

или

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1
    )
As
    Declare @TestValIn varchar(max)
    select @TestValIn='asdf'

RETURN 0 --this is the value
GO

Ваша хранимая процедура на самом деле ничего не делает: результатов нет. Чтобы увидеть разницу ...

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1
    )
As

    select * from sys.objects

    RETURN 42 --random value
GO

DECLARE @rtn int
EXEC @rtn = Custom.test
--you have the output of sys.objects now
--and the scalar RETURN value
SELECT @rtn
0 голосов
/ 09 июня 2011

Вам нужно, чтобы откровенность сказала, какое значение вернуть. По умолчанию 0

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1
    )
As
    Declare @TestValIn varchar(max)
    select @TestValIn='asdf'

    RETURN 0

GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...