【问题标题】:Dynamic SQL MERGE: Not a valid identifier动态 SQL MERGE:不是有效的标识符
【发布时间】:2018-02-18 08:06:19
【问题描述】:

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

合并代码生成可靠,但无法执行

'无效的标识符'

错误。我认为这与我如何转义 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;

【问题讨论】:

  • 不能添加相同的主键,插入的值必须是grp_id的1,2,3,4

标签: sql-server tsql merge


【解决方案1】:

我建议使用sp_executesql overEXEC:

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

【讨论】:

    【解决方案2】:

    感谢您的回复。

    只需将括号添加到 EXEC 语句 ('EXEC (@sql)') 确实允许命令行执行,但我仍然无法从存储过程中运行。但现在一切都好。

    lad2025 的链接是方法和最佳实践的绝佳参考。谢谢。

    SUM:从存储过程中执行动态 sql 合并语句的关键 - 使用带有参数的“EXEC sp_executesql”。更安全,避免报价问题 - 使用 nvarchars

    【讨论】:

    • 正是这个。看看this documentation,你会发现“执行存储过程或函数”不需要括号。但是,要“执行字符串”,您必须包含方括号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多