sp_executesql устанавливает столбец в ноль - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь выполнить некоторый SQL внутри sp_executesql.

Вот сгенерированный SQL:

exec sp_executesql
N'declare @RC int
EXECUTE @RC = [dbo].[sp_StoredProcedureName]
  @parameterName
select @RC',
N'@parameterName nvarchar(4000)',
@parameterName=N'TEST'

Вот хранимая процедура, которая вызывается из сгенерированного SQL:

ALTER PROCEDURE [dbo].[sp_StoredProcedureName] (
    @parameterName varchar(4000)
)
with execute as owner
as

DECLARE @returnValue int

BEGIN TRANSACTION 

INSERT INTO [dbo].[TableName]
        (parameterName)
    VALUES
        (@parameterName)
    set @returnValue = IDENT_CURRENT('TableName')
COMMIT

SELECT @returnValue
GO

По какой-то причине параметр parameterName никогда не устанавливается.

При попытке выбрать из TableName после выполнения SP имя_параметра равно NULL.

Я использую MSSQL.SQL был сгенерирован ADO.NET.

1 Ответ

2 голосов
/ 14 июня 2019

Это слишком долго для комментария.

Ваша хранимая процедура ничего не возвращает, поэтому возвращаемое значение равно NULL.

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

Реальные возвращаемые значения должны быть возвращены через output параметров.

Кроме того, я настоятельно рекомендую для этой цели предложение OUTPUT:

ALTER PROCEDURE [dbo].[sp_StoredProcedureName] (
    @parameterName varchar(4000),
    @returnValue int OUTPUT
)
with execute as owner
as
BEGIN
    DECLARE @ids TABLE (id int);

    INSERT INTO [dbo].[TableName] (parameterName)
        OUTPUT id INTO @ids
        VALUES (@parameterName);

    SELECT TOP (1) @returnValue = id  -- only 1 is expected anyway
    FROM @ids;
END;

Тогда вы бы назвали это:

declare @RC int;
declare @parameterName nvarchar(4000);
set @parameterName = N'TEST';

exec [dbo].[sp_StoredProcedureName] @parameterName, @rc int OUTPUT;

Динамический SQL не требуется.

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