PowerShell 中忽略的 sqlcmd -v 参数

sqlcmd -v parameter ignored in PowerShell

我已阅读文档 (sqlcmd Utility),但我无法使 sqlcmd-v 参数按预期工作。

假设这个 SQL 脚本 (echo.sql):

:setvar THE_PATH C:\Users\Craig\Desktop
PRINT 'THE_PATH: $(THE_PATH)'

:setvar THE_TOP 10
PRINT 'THE_TOP: $(THE_TOP)'

当 运行 在未设置 -v 参数的 PowerShell 提示符下时:

PS> sqlcmd -E -S 'server' -d 'database' -i '.\echo.sql'
THE_PATH: C:\Users\Craig\Desktop
THE_TOP: 10

设置数值变量(THE_TOP)被忽略:

PS> sqlcmd -E -S 'server' -d 'database' -i '.\echo.sql' -v THE_TOP=5

PS> sqlcmd -E -S 'server' -d 'database' -i '.\echo.sql'
THE_PATH: C:\Users\Craig\Desktop
THE_TOP: 10

如果我在 echo.sql 中删除 THE_TOP 的默认值,它强化了参数被忽略的断言:

:setvar THE_TOP
PRINT 'THE_TOP: $(THE_TOP)'

PS> sqlcmd -E -S 'server' -d 'database' -i '.\echo.sql' -v THE_TOP=5
THE_PATH: C:\Users\Craig\Desktop
THE_TOP: $(THE_TOP)

如果我尝试设置 THE_PATH 参数,我得到:

PS> sqlcmd -E -S 'server' -d 'database' -i '.\echo.sql' -v THE_PATH="C:\path"
Sqlcmd: ':\path': Invalid argument. Enter '-?' for help.

正确的 -v 语法是什么?

好吧,这是弱智

如果在脚本中使用:setvar

:setvar THE_TOP
PRINT 'THE_TOP: $(THE_TOP)'

然后您尝试在 PowerShell 提示符下设置它,您将收到错误消息:

PS> sqlcmd -E -S server -d database -i .\echo.sql -v THE_TOP=5
'THE_TOP' scripting variable not defined.

但是,如果您不在脚本中设置它:

-- variable disabled
-- :setvar THE_PATH
PRINT 'THE_TOP: $(THE_TOP)'

然后您尝试在 PowerShell 提示符下设置它,然后它将按(并非真的)预期工作:

PS> sqlcmd -E -S server -d database -i .\echo.sql -v THE_TOP=5
THE_TOP: 5

** 编辑 **

将动态生成的路径作为参数提供给脚本文件 (extract.sql):

:out $(THE_PATH)\extract.csv
SELECT  *
FROM    the_table
WHERE   the_key = $(THE_ID)
...

在 PowerShell 会话中执行:

PS> $cd = Get-Location
PS> sqlcmd -E -S 'server' -d 'database' -i '.\extract.sql' -v THE_ID=5 THE_PATH=`"$cd\build`"