sqlcmd导入数据库时忽略脚本变量的问题求助
解决sqlcmd导入时
$(xxx)文本被识别为脚本变量的问题 问题场景
- 场景一:执行以下INSERT语句时,报错
'mid' scripting variable not defined
原因:sqlcmd把INSERT INTO [users] ([id],[email],[title],[desc]) VALUES (1096,'sda@asfsdf.com',N'Shami Doc', N'This is profile of Shami who sends $(mid) message');$(mid)当成了未定义的脚本变量。 - 场景二:执行以下INSERT语句时出现语法错误
原因:sqlcmd认为INSERT INTO [users] ([id],[email],[title],[desc]) VALUES (1091,'das@dsa.com',N'Raj Doc', N'This is profile of Raj who sends $(m message');$(m是不完整的变量引用,导致语法解析失败。
解决办法
方法1:修改SQL语句转义$(推荐)
sqlcmd里要把$作为普通文本存储,直接把单个$改成$$就行,这样不会触发变量识别:
- 场景一修正后语句:
INSERT INTO [users] ([id],[email],[title],[desc]) VALUES (1096,'sda@asfsdf.com',N'Shami Doc', N'This is profile of Shami who sends $$(mid) message'); - 场景二修正后语句:
INSERT INTO [users] ([id],[email],[title],[desc]) VALUES (1091,'das@dsa.com',N'Raj Doc', N'This is profile of Raj who sends $$(m message');
方法2:执行sqlcmd时修改变量分隔符
如果不想改SQL文件,执行sqlcmd时用-v参数重新指定变量分隔符,比如改成@@,这样sqlcmd只会认@@xxx为变量,忽略$(xxx):
sqlcmd -S 你的服务器地址 -d 目标数据库名 -i 你的SQL脚本文件.sql -v VARSEP=@@
方法3:完全禁用sqlcmd变量替换
如果你的脚本里没有需要正常替换的变量,可以用-x参数彻底关闭变量替换功能,这样所有$(xxx)都会被当成普通文本:
sqlcmd -S 你的服务器地址 -d 目标数据库名 -i 你的SQL脚本文件.sql -x
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

