gpt4 book ai didi

sql-server - 如何使用批处理中的参数运行 sqlcmd 并将返回值分配给变量?

转载 作者:可可西里 更新时间:2023-11-01 10:05:31 25 4
gpt4 key购买 nike

我有一个 MS SQL 脚本,它接受两个变量并执行它应该执行的操作,返回一个值。

在我的批处理文件中,我按如下方式调用此脚本,并获得了预期的输出。

sqlcmd -v ALM_Domain=%dom% ProjectName=%proj% /h-1 -S %DB% -E -C -i GetDBNameForDomainProject.sql

但是,我需要在后续处理中使用查询返回的值,并决定将返回值赋给一个变量。为此,我使用了以下结构

for /F usebackq %%a IN (`sqlcmd -v ALM_Domain=%dom% ProjectName=%proj% /h-1 -S %DB% -E -C -i GetDBNameForDomainProject.sql`) do (
set DBNAME=%%a
)

为此我收到以下错误:

Sqlcmd: 'NCA ProjectName SIM': Invalid argument. Enter '-?' for help.

请注意“=”符号似乎已经消失。 for命令状态的帮助:

最后,您可以使用 FOR/F 命令来解析 a 的输出命令。您可以通过在括号中的反引号字符串。它将被视为命令行,传递给子 CMD.EXE 并捕获输出存入内存并像处理文件一样进行解析。

如果我尝试使用:

for /F %%a IN ('sqlcmd -v "ALM_Domain=%dom% ProjectName=%proj%" /h-1 -S %DB% -E -C -i GetDBNameForDomainProject.sql') do (
set DBNAME=%%a
)

我得到:

Sqlcmd: 'ALM_DOMAIN=NCA ProjectName=SIM': Invalid argument.

最佳答案

与您的问题无关 - 使用 FOR/F 执行命令时很少需要 USEBACKQ。它的主要用途是允许从名称中包含空格或有毒字符的文件中读取,这些字符需要引号来保留。但是双引号通常表示一个字符串值,因此需要 USEBACKQ

for /f "usebackq" %%A in ("file name with spaces.txt") do ...

如果您正在执行命令,那么您所需要的只是普通的单引号,没有 USEBACKQ 选项

for /f %%A in ('someCommand.exe') do ...

您当然可以将 USEBACKQ 与反引号一起使用,但我认为没有任何好处。

现在针对您的实际问题 - 您已经注意到解析器已经转换了您的 =进入 <space> .这是批处理解析器的一个“功能”,它必须将命令解析为由 CMD /C 执行的字符串。 .解析器处理 = , , , ; , <tab> , <space> , 和 <0xFF>作为 token 定界符,任何连续的 token 定界符字符串都将转换为单个 <space> .

解决方案是将整个命令括在双引号内(在表示命令的外部单引号内),或者转义问题字符。对于您的情况,我相信您可以使用双引号。

for /F %%a IN ('"sqlcmd -v ALM_Domain=%dom% ProjectName=%proj% /h-1 -S %DB% -E -C -i GetDBNameForDomainProject.sql"') do (
set "DBNAME=%%a"
)

你的情况不是问题,但如果你的命令已经使用双引号,那么替代方法是转义 = .

for /F %%a IN ('sqlcmd -v ALM_Domain^=%dom% ProjectName^=%proj% /h-1 -S %DB% -E -C -i GetDBNameForDomainProject.sql') do (
set "DBNAME=%%a"
)

关于sql-server - 如何使用批处理中的参数运行 sqlcmd 并将返回值分配给变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29461666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com