TSQL合并提示目标

时间:2014-04-14 17:13:36

标签: sql-server-2008 tsql merge

我一直在阅读有关MERGE的大量内容,而且几乎我遇到的每篇文章都讨论了不使用表提示时的并发问题和主键冲突。此特定查询将不在并发环境中,但我想测试语法。我最近整理了一个简短的脚本示例,以帮助其他开发人员,但无法弄清楚它为什么不解析。

有人能说清楚这个吗?

DECLARE @Table1 TABLE (ID INT PRIMARY KEY IDENTITY(1,1), Test CHAR(1))
DECLARE @Table2 TABLE (ID INT PRIMARY KEY IDENTITY(1,1), Test CHAR(1))
INSERT INTO @Table2 (Test) VALUES ('A'),('B')


MERGE INTO @Table1 WITH(HOLDLOCK) AS T 
USING @Table2 AS S
ON (T.ID = S.ID)
WHEN NOT MATCHED THEN
    INSERT (Test) VALUES (S.Test)
OUTPUT $action, inserted.*;

消息156,第15级,状态1,第7行 关键字' WITH'

附近的语法不正确
  • 语法似乎是msdn的要求:MSDN
  • 这些人链接确认语法SO LINk
  • 我唯一能想到的就是能够对表变量进行表锁定吗?

1 个答案:

答案 0 :(得分:0)

花了半个小时后,我意识到表提示仅适用于 permanent&临时表但不包含表变量!!!

CREATE TABLE #Table1  (ID INT PRIMARY KEY IDENTITY(1,1), Test CHAR(1))
CREATE TABLE #Table2  (ID INT PRIMARY KEY IDENTITY(1,1), Test CHAR(1))
INSERT INTO #Table2 (Test) VALUES ('A'),('B')

MERGE INTO #Table1  WITH(HOLDLOCK) AS T 
USING #Table2 AS S
ON (T.ID = S.ID) 
WHEN NOT MATCHED THEN
    INSERT   (Test)  VALUES (S.Test) 
OUTPUT $action, inserted.*;

SELECT * FROM #Table1

DROP TABLE #Table1
DROP TABLE #Table2

请检查此查询。