【发布时间】: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
【问题讨论】:
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
谢谢@marc_s 我不知道
标签: sql-server tsql stored-procedures