用 GO 分解插入语句

Raf*_*ael 4 sql-server scripting merge

我正在尝试建立这个答案如何运行包含许多插入的大型脚本而不会耗尽内存?

而分手的查询与较小的BEGIN TRANSACTION,然后GO

BEGIN TRANSACTION; 

MERGE ghcnd.dbo.us_APCP as target 
using 
(values 
  ('US1CASN0123','2018-03-22','--N','251'),
  ('US1KSGO0013','2018-03-22','--N','41'),
  ('US1WYFM0039','2018-03-22','--N','0'),
  ('US1SCCF0008','2018-03-22','--N','10')) 
as source(cell,[date],valueFlag,[value]) 
on target.cell = source.cell 
AND target.date = source.date  
when matched then 
    update 
    set valueFlag = source.valueFlag , 
        value = source.value 
when not matched then 
    insert (cell,[date],valueFlag,[value]) 
    values (cell,[date],valueFlag,[value]) 

COMMIT TRANSACTION; GO 
Run Code Online (Sandbox Code Playgroud)

但是我收到这个错误

消息 102,级别 15,状态 1,第 3 行 ')' 附近的语法不正确。消息 102,级别 15,状态 1,第 3 行“GO”附近的语法不正确。

Sol*_*zky 10

问题一

GO是默认的查询批处理分隔符。它是某些客户端实用程序(主要是 SQLCMD 和 SSMS)的一项功能,SQL Server 引擎本身不知道它。GO需要单独在一行上(可选择仅后跟一个 INT 值以导致重复该批处理),因为这些客户端实用程序对其进行分析以指示将提交到 SQL Server 的内容拆分到何处。

它不能包含在任何动态 SQL 中,因为 SQL Server 也不知道它。也没有必要包含在动态 SQL 中,因为每次调用EXEC()都是它自己的查询批处理。

所以,

  • 如果您要通过 SSMS 或 SQLCMD 生成要执行的 SQL 脚本,则只需在COMMIT TRANSACTION;GO
  • 如果您正在生成动态 SQL 以通过EXEC(@SQL)调用运行这些块中的每一个,则只需删除GO.

问题二

解决这个GO情况后,你会发现你仍然有一个语法错误。还表明您有两条错误消息。问题是您缺少;需要终止MERGE语句的分号 ( ) 。如果您在修复 之后尝试执行GO,您将收到以下错误:

消息 10713,级别 15,状态 1,第 XXXXX 行
MERGE 语句必须以分号 (;) 结束。

只需添加一个分号之前COMMIT TRANSACTION整个事情应该工作。如:

values (cell,[date],valueFlag,[value]); -- <-- that guy, right there :-)
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

752 次

最近记录:

7 年,4 月 前