11

我正在使用 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"...]

我在这里错过了什么吗?

4

4 回答 4

15

您不需要将变量传递给 sqlcmd。它会自动从您的 shell 变量中选择:例如

导出参数 1=DUMMYVALUE

sqlcmd -S $host -U $user -P $pwd -d $db -i input.sql

于 2017-04-27T14:59:30.707 回答
8

在 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 
于 2012-07-26T14:35:01.557 回答
1

你可以在linux中导出变量。之后,您将不需要将变量传递给sqlcmd. :setvar但是,我确实注意到如果没有默认值,您将需要更改您的 sql 脚本并删除该命令。

export dbName=xyz
sqlcmd -Uusername -Sservername -Ppassword -i script.sql


:setvar dbName  --remove this line
USE [$(dbName)]
GO
于 2018-04-05T21:52:01.323 回答
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
于 2020-09-27T17:06:32.487 回答