我正在使用Korn shell在Linux机箱(Red Hat Enterprise Server 5.3 tikanga)上运行适用于Linux的Microsoft SQLCMD工具(CTP 11.0.1720.0)。该工具已正确配置,除了使用脚本变量外,在所有情况下均可使用。
我有一个SQL脚本,看起来像这样。
SELECT COLUMN1 FROM TABLE WHERE COLUMN2 = '$(param1)';
我正在运行这样的sqlcmd
命令。
sqlcmd -S server -d database -U user -P pass -i input.sql -v param1="DUMMYVALUE"
执行上述命令时,出现以下错误。
Sqlcmd: 'param1=DUMMYVALUE': Invalid argument. Enter '-?' for help.
帮助列出了以下语法。
[-v var = "value"...]
我在这里错过了什么吗?
答案 0 :(得分:10)
您不需要将变量传递给sqlcmd。它会从您的shell变量中自动选择: e.g。
export param1 = DUMMYVALUE
sqlcmd -S $host -U $user -P $pwd -d $db -i input.sql
答案 1 :(得分:6)
在RTP版本(11.0.1790.0)中,-v
开关在执行sqlcmd -?
时不会出现在参数列表中。显然,该工具的Linux版本不支持此选项
据我所知,从环境变量导入参数值也不起作用。
如果需要解决方法,一种方法是将一个或多个:setvar
语句与包含要运行的命令的文本文件连接到一个新文件中,然后执行新文件。根据您的示例:
echo :setvar param1 DUMMYVALUE > param_input.sql
cat input.sql >> param_input.sql
sqlcmd -S server -d database -U user -P pass -i param_input.sql
答案 2 :(得分:1)
您可以在linux中导出变量。之后,您不需要在sqlcmd
中传递变量。但是,我确实注意到你需要更改你的sql脚本并删除:setvar
命令,如果它没有默认值。
export dbName=xyz
sqlcmd -Uusername -Sservername -Ppassword -i script.sql
:setvar dbName --remove this line
USE [$(dbName)]
GO
答案 3 :(得分:0)
我认为您只是没有正确引用输入变量。我创建了这个bash脚本...
#!/bin/bash
# Create a sql file with a parameterized test script
echo "
set nocount on
select k = '-db', v = '\$(db)' union all
select k = '-schema', v = '\$(schema)' union all
select '-', 'static'
go" > ./test.sql
# capture input variables
DB=$1
SCHEMA="${2:-dbo}"
# Exec sqlcmd
sqlcmd -S 'localhost\lemur' -E -i ./test.sql -v "db=${DB}" -v "schema=${SCHEMA}"
...并像这样测试它:
$ ./test.sh master
k v
------- ------
-db master
-schema dbo
- static