SQLCMD.exe以语法错误退出,其中不存在语法错误

时间:2018-10-30 18:35:34

标签: sql-server sqlcmd

我正在使用SQLCMD.exe运行中等大小的脚本(大约900MB),并且遇到了奇怪的情况。

该脚本包含数千个插入语句。当我运行它时,它将运行一段时间,执行良好,然后在某个时候将退出并显示错误:

  

Sqlcmd:错误:文件中_SOME_LINE_NUMBER_行的语法错误   'd:\ myscript.sql'。

现在,问题是,该行号(或脚本中的其他任何地方)没有错误。如果我转到给定的行并抓住其中包含的语句块,则它将在SSMS中没有问题。我通常会转到该文件并将其截断,以使它从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 Server 512MB的本地实例上运行该内存),所以我将可用内存提高到2GB,但结果没有变化。

仅供参考,这是SQL Server 2014,我使用-V 17运行脚本(我猜这没有效果,因为语法错误足够高)?

谢谢。

1 个答案:

答案 0 :(得分:1)

总结一下我的评论:

验证command line options you're using for sqlcmd.exe。请注意,这些选项区分大小写。您应该能够使用-b -e告诉sqlcmd在遇到错误时停止执行,并回显正在尝试运行的命令。

您还应该考虑-x(禁用变量替换)和-X(禁用脚本命令)参数。如果您要插入的数据可能包含看起来像sqlcmd替代变量$(variable)的数据,则需要指定-x才能禁用该功能。