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()
都是它自己的查询批处理。
所以,
COMMIT TRANSACTION;
和GO
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 次 |
最近记录: |