【问题标题】:Why my stored procedure is always receiving NULL parameters?为什么我的存储过程总是接收 NULL 参数?
【发布时间】:2019-07-04 16:34:55
【问题描述】:

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

【问题讨论】:

标签: sql-server tsql stored-procedures


【解决方案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 的回答。

【讨论】:

  • 其实我不知道自己在做什么,我对创建存储过程很陌生。我认为动态sql和常规sql是一样的。感谢您的帮助,这种方式效果很好! :)
猜你喜欢
  • 2010-09-13
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多