使用sqlcmd执行.sql文件报错,控制台直接执行语句却正常
问题描述
我有如下file.sql文件:
INSERT INTO "Parcelas" ("PlanEstudio", "LineaEstudio", "NIF", "Plan", "Cosecha", "Linea", "Modulo", "CombCoberturas", "Referencia", "Hoja", "Parcela", "Cultivo", "Variedad", "GrupoVarietal", "Comarca", "ProvSigPac", "TermSigPac", "AgreSigPac", "ZonaSigPac", "PoliSigPac", "ParcSigPac", "ReciSigPac", "Superficie", "Arboles", "Edad", "ProdPrinc", "ProdComp", "Precio", "ValorProcPrinc", "ValorProdComp", "PRE", "PRF", "RendAsig2021") VALUES (2022, 300, '43729050R', 2020, 2021, 300, '2', 2, 'K826975', 2, 11, 5, 26, '31-08', 9, 25, 900, 0, 0, 26, 371, 1, 0.86, 1016, 18, 35000, 0, 0.25, 8750, 0, 35000, 22229, 0);
使用命令执行该文件时出现错误:
$ /opt/mssql-tools/bin/sqlcmd -S "$SERVER" -d "$DATABASE" -U "$USER" -P "$PASSWORD" -i a.sql
Msg 102, Level 15, State 1, Server BBDD-DES, Line 1
Incorrect syntax near 'Parcelas'.
但直接进入sqlcmd控制台执行相同的INSERT语句时无异常,请问为何无法通过.sql文件执行该插入操作?
可能的原因及解决方案
1. 文件编码含BOM头
最常见的原因是file.sql采用了UTF-8带BOM的编码格式。sqlcmd会将文件开头的BOM(EF BB BF)视为无效字符,导致SQL语句开头被破坏,触发语法错误。而直接在控制台输入语句时没有BOM,所以能正常执行。
解决方法:
- 将文件转换为UTF-8无BOM或ASCII编码。比如用Notepad++:打开文件后,点击「编码」→「转为UTF-8无BOM编码」,保存后重新执行。
- 使用vim处理:打开文件后输入
:set nobomb,再执行:wq保存退出。
2. 文件包含隐藏字符
复制粘贴SQL语句时,可能带入了不可见的控制字符(如特殊换行符、非标准空格),这些字符在控制台手动输入时不会出现,但存在于文件中会干扰SQL解析。
解决方法:
- 用文本编辑器的「显示所有字符」功能(如Notepad++的「视图」→「显示符号」→「显示所有字符」)检查文件,删除异常字符。
- 手动重新输入SQL语句到新文件中,避免复制粘贴。
3. 文件名或路径问题
如果实际执行的a.sql和你编辑的file.sql不是同一个文件,或者路径中存在空格、特殊字符未转义,也可能导致读取的文件内容异常。
解决方法:
- 确认执行命令中的文件名和实际文件一致,或者使用绝对路径指定文件:
$ /opt/mssql-tools/bin/sqlcmd -S "$SERVER" -d "$DATABASE" -U "$USER" -P "$PASSWORD" -i /path/to/your/file.sql
内容的提问来源于stack exchange,提问作者santos82h
相关产品推荐
相关产品推荐

