sp_executesql将列设置为null

时间:2019-06-14 13:41:28

标签: sql tsql stored-procedures parameters sp-executesql

我正在尝试在sp_executesql内部执行一些SQL。

这是生成的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。

在执行SP后尝试从TableName中选择时,ParameterName为NULL。

我正在使用MS SQL。该SQL是由ADO.NET生成的。

1 个答案:

答案 0 :(得分:2)

这个评论太长了。

您的存储过程未返回任何内容,因此返回值为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。