Sql server 为什么我的存储过程总是接收空参数?
我创建了一个T-SQL脚本,当我直接执行它时,它工作得非常好。然后我将这个脚本放入一个带有2个参数的存储过程中,但是当我执行它时,没有任何行受到影响。。。然后我发现我的存储过程总是将我的2个参数接收为NULLSql 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
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_我不知道