我创建了一个T-SQL脚本,当我直接执行它时效果很好。然后,我将此脚本放入具有2个参数的存储过程中,但是当我执行该脚本时,没有任何行受到影响...然后我发现我的2个参数始终被存储过程接收为NULL。
我尝试在创建存储过程脚本中设置默认参数值,但是即使那样,它们也为NULL。
我尝试不将参数声明为@SQLString
内的标量变量,因为它们已经使用CREATE PROCEDURE
作为参数创建,但是出现了错误:
必须声明标量变量
当我尝试执行存储过程时。
CREATE PROCEDURE [dbo].[sp_InsertMetierEventRelation]
@metier NVARCHAR(50),
@evenement NVARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQLString NVARCHAR(4000)
SET @SQLString = N'
DECLARE @rowId INT, @metier NVARCHAR(50), @evenement NVARCHAR(50)
SELECT @metier AS metierParam -- always NULL
SELECT @evenement AS evenementParam -- always NULL
SELECT met_id FROM [dbo].[t_metier] WHERE [met_nom] = @metier
SELECT eve_id FROM [dbo].[t_evenement] WHERE [eve_nom] = @evenement
-- some other code
'
EXECUTE sp_executesql @SQLString
END
GO
我以这种方式调用存储过程:
EXEC [dbo].[sp_InsertMetierEventRelation]
@metier = 'Organisation de mariage',
@evenement = 'Evènement religieux';
或者这样:
EXEC [dbo].[sp_InsertMetierEventRelation]
'Organisation de mariage', 'Evènement religieux';
我得到了相同的结果:
metierParam NULL
evenementParam NULL
met_id NO RESULT
eve_id NO RESULT
答案 0 :(得分:1)
您需要动态SQL吗?如果将其简化为:
CREATE PROCEDURE [dbo].[sp_InsertMetierEventRelation]
@metier NVARCHAR(50),
@evenement NVARCHAR(50)
AS
SELECT met_id FROM [dbo].[t_metier] WHERE [met_nom] = @metier
SELECT eve_id FROM [dbo].[t_evenement] WHERE [eve_nom] = @evenement
然后运行EXEC [dbo].[sp_InsertMetierEventRelation] ...
如果您确实需要动态SQL,请参阅John Cappelletti的回答。