动态SQL MERGE:不是有效的标识符

时间:2018-02-18 08:06:20

标签: sql-server tsql merge

我编写了一个存储过程,我们将用它来动态生成合并代码并同步数据集。

合并代码生成可靠但无法使用

执行
  

'无效识别者'

错误。我认为它与我如何逃避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;

2 个答案:

答案 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