我编写了一个存储过程,我们将用它来动态生成合并代码并同步数据集。
合并代码生成可靠但无法使用
执行'无效识别者'
错误。我认为它与我如何逃避varchar值有关,但我似乎无法解决它
我很欣赏任何有关我绊倒的地方的见解。
--CREATE TABLE dbo.temp_share_test
--(grp_id int not null,
--co_code varchar(10) not null,
--sp_no INT not null,
--sp_code varchar(10) not null,
--sp_type varchar(10),
--sp_colour varchar(10));
--alter table dbo.temp_share_test add constraint pk_temp_share_test
--primary key (grp_id, co_code, sp_no, sp_code);
--insert into dbo.temp_share_test (grp_id, co_code, sp_no, sp_code, sp_type, sp_colour)
--values
--(2,'A',1,'X',1,'GREEN'),
--(2,'A',2,'Y',2,'BLUE'),
--(2,'A',3,'X',3,'YELLOW');
DECLARE @sql VARCHAR(MAX)
SET @sql =
'MERGE dbo.temp_share_test AS t
USING (SELECT * FROM dbo.temp_share_test WHERE grp_id = 2 AND co_code = ''A'') AS s
ON (t.grp_id = 2 AND t.co_code = ''H'' AND t.sp_no = s.sp_no AND t.sp_code = s.sp_code)
WHEN NOT MATCHED THEN INSERT (grp_id, co_code,sp_code,sp_no,sp_type,sp_colour)
VALUES (2, ''H'',s.sp_code,s.sp_no,s.sp_type,s.sp_colour);'
exec @sql;
答案 0 :(得分:1)
感谢您的回复。
只需在EXEC语句中添加括号(' EXEC(@sql)')确实允许命令行执行,但我仍然无法在存储过程中运行。但现在一切都很好。
lad2025的链接是方法和最佳实践的绝佳参考。谢谢。
SUM:从存储过程中执行动态sql合并语句的关键 - 使用' EXEC sp_executesql'带参数。更安全,避免报价问题 - 使用nvarchars
答案 1 :(得分:1)
我建议sp_executesql
使用EXEC
:
DECLARE @sql NVARCHAR(MAX) =
'MERGE dbo.temp_share_test AS t
USING (SELECT * FROM dbo.temp_share_test WHERE grp_id = 2 AND co_code = ''A'')
AS s
ON (t.grp_id = 2 AND t.co_code = ''H'' AND t.sp_no = s.sp_no
AND t.sp_code = s.sp_code)
WHEN NOT MATCHED THEN INSERT (grp_id, co_code,sp_code,sp_no,sp_type,sp_colour)
VALUES (2, ''H'',s.sp_code,s.sp_no,s.sp_type,s.sp_colour);'
EXEC sp_executesql @sql;
<强> DBFiddle Demo 强>
在处理动态SQL时,我强烈建议您阅读:The Curse and Blessings of Dynamic SQL