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

Sql server 为什么我的存储过程总是接收空参数?,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我创建了一个T-SQL脚本,当我直接执行它时,它工作得非常好。然后我将这个脚本放入一个带有2个参数的存储过程中,但是当我执行它时,没有任何行受到影响。。。然后我发现我的存储过程总是将我的2个参数接收为NULL CREATE PROCEDURE [dbo].[sp_InsertMetierEventRelation] @metier NVARCHAR(50), @evenement NVARCHAR(50) AS BEGIN SET NOCOUNT ON; DECL

我创建了一个T-SQL脚本,当我直接执行它时,它工作得非常好。然后我将这个脚本放入一个带有2个参数的存储过程中,但是当我执行它时,没有任何行受到影响。。。然后我发现我的存储过程总是将我的2个参数接收为NULL

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
我尝试在创建存储过程脚本中设置默认参数值,但即使这样,它们也是空的

我试图在
@SQLString
中不将参数声明为标量变量,因为它们已经是用
创建过程作为参数创建的,但我得到了错误:

必须声明标量变量

当我试图执行存储过程时

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吗?如果将其简化为:

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\u InsertMetierEventRelation]…


如果您确实需要动态SQL,请参阅John Cappelletti的答案。

事实上,我不知道自己在做什么,我对创建存储过程非常陌生。我认为动态sql和常规sql是一样的。谢谢你的帮助,这样效果很好!:)旁注:存储过程不应使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!谢谢你@marc_我不知道