Sql server 2008 目标上的TSQL合并提示

Sql server 2008 目标上的TSQL合并提示,sql-server-2008,tsql,merge,Sql Server 2008,Tsql,Merge,我已经阅读了很多关于合并的文章,并且几乎每一篇我遇到的文章都谈到了并发性问题和不使用表提示时的主键冲突。这个特定的查询将不在并发环境中,但我想测试语法。我最近编写了一个简短的脚本示例来帮助另一个开发人员解决问题,但我无法理解为什么它没有解析 有人能解释一下吗 DECLARE @Table1 TABLE (ID INT PRIMARY KEY IDENTITY(1,1), Test CHAR(1)) DECLARE @Table2 TABLE (ID INT PRIMARY KEY IDENTIT

我已经阅读了很多关于合并的文章,并且几乎每一篇我遇到的文章都谈到了并发性问题和不使用表提示时的主键冲突。这个特定的查询将不在并发环境中,但我想测试语法。我最近编写了一个简短的脚本示例来帮助另一个开发人员解决问题,但我无法理解为什么它没有解析

有人能解释一下吗

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.*;
Msg 156第15级第1状态第7行 关键字“WITH.”附近的语法不正确。

  • 语法似乎符合msdn的要求:
  • 这个链接在某种程度上证实了语法
  • 我能想到的唯一一件事就是在表变量上有一个表锁

花了半个小时后,我意识到tableHINT仅适用于永久和临时表,而不适用于表变量


请检查此查询。

我刚刚确认,在上面定义的相同上下文下使用哈希表或物理表时,此行为不一致。它似乎与表变量隔离。可能是类似的问题。我真的希望看到那个家伙评论表变量不支持锁定的理由。MSDN似乎没有找到任何像他的声明那样明确的东西。
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