为什么我的存储过程总是接收NULL参数?

时间:2019-07-04 16:34:55

标签: sql-server tsql stored-procedures

我创建了一个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

1 个答案:

答案 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的回答。