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`"
我已阅读文档 (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`"