我正在尝试在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生成的。
答案 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。