SQLCMD.exe 退出时出现语法错误,但不存在语法错误
SQLCMD.exe exiting with syntax error where not syntax error exists
我正在 运行使用 SQLCMD.exe 编写一个中等大小的脚本(大约 900MB),但我 运行 遇到了一个奇怪的情况。
该脚本由几千条插入语句组成。当我 运行 它时,它会 运行 一段时间,执行正常,然后在某个时候它会退出并出现错误:
Sqlcmd: Error: Syntax error at line _SOME_LINE_NUMBER_ in file
'd:\myscript.sql'.
现在的问题是,该行号(或脚本中的其他任何地方)没有错误。如果我转到给定行并获取包含它的语句块,它将 运行 在 SSMS 中没问题。我通常转到文件并 t运行 对其进行分类,使其从 SQLCMD 不喜欢的语句语句开始(实际上,我在它之前开始了几个语句) - 即我删除了已经 运行 的东西。我 运行 使用 SQLCMD 的新 sql 文件,整个过程重复自身,并出现相同的错误引用不同的行(它抱怨的原始行这次没有问题)。
如果我重新运行脚本而不编辑它(删除已经处理的部分),那么每次我重新运行它似乎都在相同的行号上失败。同样,实际上没有语法错误。
这是文件中数千个语句块的示例:
DECLARE @tblOutput table (ID int);
BEGIN TRANSACTION
IF NOT EXISTS (SELECT * FROM MyTable WHERE ID=123)
BEGIN
INSERT INTO MyTable(Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9)
OUTPUT INSERTED.ID INTO @tblOutput(ID)
VALUES(1, '2', '3', '4', 5, 6, (SELECT TOP 1 ID FROM SomeOtherTable WHERE Name='Something'), (SELECT TOP 1 ID FROM YetAnotherTable WHERE Name='321'), 9 )
INSERT INTO MyTable2(Col1, Col2, FKID)
VALUES(1, 0, (SELECT TOP 1 ID FROM @tblOutput) )
END
IF NOT EXISTS (SELECT * FROM RelatedTable WHERE stuff='something')
BEGIN
INSERT INTO RelatedTable(Col1, Col2)
VALUES ('test', (SELECT TOP 1 ID FROM @tblOutput) )
END
COMMIT TRANSACTION
DELETE FROM @tblOutput
GO
运行SQLCMD.exe如下:
SQLCMD.EXE -S localhost -d mydatabase -V 17 -i dataimport.sql -o dataimport.log
有人可以猜测为什么会发生这种情况吗?我认为这可能与内存有关(我 运行 在本地实例上使用它,该实例只分配给 SQL 服务器 512MB)所以我将可用内存增加到 2GB 但结果没有变化.
仅供参考,这是 SQL Server 2014,我 运行 带有 -V 17 的脚本(我猜这没有效果,因为语法错误的错误级别足够高?)。
提前致谢。
根据我的评论总结:
验证 command line options you're using for sqlcmd.exe。请注意,选项区分大小写。您应该能够使用 -b -e
告诉 sqlcmd 在遇到错误时停止执行,并且还回显它试图 运行.
的命令
您还应该考虑 -x
(禁用变量替换)和 -X
(禁用脚本命令)参数。如果您要插入的数据可能包含看起来像 sqlcmd 替换变量 $(variable)
的数据,您将需要指定 -x
以禁用该功能。
我正在 运行使用 SQLCMD.exe 编写一个中等大小的脚本(大约 900MB),但我 运行 遇到了一个奇怪的情况。
该脚本由几千条插入语句组成。当我 运行 它时,它会 运行 一段时间,执行正常,然后在某个时候它会退出并出现错误:
Sqlcmd: Error: Syntax error at line _SOME_LINE_NUMBER_ in file 'd:\myscript.sql'.
现在的问题是,该行号(或脚本中的其他任何地方)没有错误。如果我转到给定行并获取包含它的语句块,它将 运行 在 SSMS 中没问题。我通常转到文件并 t运行 对其进行分类,使其从 SQLCMD 不喜欢的语句语句开始(实际上,我在它之前开始了几个语句) - 即我删除了已经 运行 的东西。我 运行 使用 SQLCMD 的新 sql 文件,整个过程重复自身,并出现相同的错误引用不同的行(它抱怨的原始行这次没有问题)。
如果我重新运行脚本而不编辑它(删除已经处理的部分),那么每次我重新运行它似乎都在相同的行号上失败。同样,实际上没有语法错误。
这是文件中数千个语句块的示例:
DECLARE @tblOutput table (ID int);
BEGIN TRANSACTION
IF NOT EXISTS (SELECT * FROM MyTable WHERE ID=123)
BEGIN
INSERT INTO MyTable(Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9)
OUTPUT INSERTED.ID INTO @tblOutput(ID)
VALUES(1, '2', '3', '4', 5, 6, (SELECT TOP 1 ID FROM SomeOtherTable WHERE Name='Something'), (SELECT TOP 1 ID FROM YetAnotherTable WHERE Name='321'), 9 )
INSERT INTO MyTable2(Col1, Col2, FKID)
VALUES(1, 0, (SELECT TOP 1 ID FROM @tblOutput) )
END
IF NOT EXISTS (SELECT * FROM RelatedTable WHERE stuff='something')
BEGIN
INSERT INTO RelatedTable(Col1, Col2)
VALUES ('test', (SELECT TOP 1 ID FROM @tblOutput) )
END
COMMIT TRANSACTION
DELETE FROM @tblOutput
GO
运行SQLCMD.exe如下:
SQLCMD.EXE -S localhost -d mydatabase -V 17 -i dataimport.sql -o dataimport.log
有人可以猜测为什么会发生这种情况吗?我认为这可能与内存有关(我 运行 在本地实例上使用它,该实例只分配给 SQL 服务器 512MB)所以我将可用内存增加到 2GB 但结果没有变化.
仅供参考,这是 SQL Server 2014,我 运行 带有 -V 17 的脚本(我猜这没有效果,因为语法错误的错误级别足够高?)。
提前致谢。
根据我的评论总结:
验证 command line options you're using for sqlcmd.exe。请注意,选项区分大小写。您应该能够使用 -b -e
告诉 sqlcmd 在遇到错误时停止执行,并且还回显它试图 运行.
您还应该考虑 -x
(禁用变量替换)和 -X
(禁用脚本命令)参数。如果您要插入的数据可能包含看起来像 sqlcmd 替换变量 $(variable)
的数据,您将需要指定 -x
以禁用该功能。