0

我已经阅读了文档( s ​​qlcmd Utility),但我无法让sqlcmd's-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)'

在没有设置参数的情况下在 PowerShell 提示符下运行时-v

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

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

: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语法?

4

1 回答 1

0

好吧,这就是迟钝。

如果: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`"
于 2016-04-28T15:52:19.127 回答