这在批处理文件中有效:
sqlcmd -Q "exec sp_mysp @refdate = '2019-04-29'" -S myserver -d mydb -o C:\myfolder\result.csv
但是我希望批处理文件遍历日期列表,并将每个列表成员作为变量传递给-Q,而不是对日期进行硬编码,并且输出文件也应以日期开头。
我尝试过一个日期
set inputdate = '2019-04-29'
set "outputfile=C:\myfolder\%inputdate%_result.csv"
sqlcmd -Q "exec sp_mysp @refdate = try_cast(%inputdate% as date) " -S myserver -d mydb -o outputfile
但出现错误:Incorrect syntax near the keyword 'as'
在输入日期前后删除'%'会显示错误消息:Incorrect syntax near 'inputdate'
使用@inputdate会产生错误:Incorrect syntax near '@inputdate'
答案 0 :(得分:1)
也许这会有所帮助:
IF exist inputfile.txt FOR /F "eol=# delims=" %%V IN (inputfile.txt) DO (
set "outputfile=C:\myfolder\%%V_result.csv"
sqlcmd -Q "exec sp_mysp @refdate = try_cast(%%V as date) " -S myserver -d mydb -o outputfile
)
此批处理命令从与.bat文件位于同一文件夹中的textfile.txt中遍历每个日期(每行一个日期),并为每个条目执行代码。
答案 1 :(得分:1)
我认为您可以尝试设置set inputdate='2019-04-29'
之类的批处理变量。
答案 2 :(得分:1)
set
用值设置变量时,需要考虑Windows cmd
的解释方式
示例:
set variable = value
这将从variable
的开头到value
的结尾进行解释。因此,在上面的示例中,您现在有一个变量%variable %
(注意尾随空格)和一个值value
的值(请注意前导空白)。因此,如果您尝试echo %variable%
,它将返回%variable%
,因为从未设置过该变量,echo %variable %
将返回一个值,但仍带有我们不希望的前导空格。>
因此,变量和=
之间不需要有空格,=
和值之间也不需要空格。另外,最好将整个变量字符串用双引号引起来,以确保值上没有尾随空格,因此,最后,您需要执行以下操作:
set "inputdate='2019-04-29'"
答案 3 :(得分:0)
我想这就是你想要的:
set inputdate = '2019-04-29'
set "outputfile=C:\myfolder\%inputdate%_result.csv"
sqlcmd -Q "exec sp_mysp @refdate = try_cast($(inputdate) as date) " -S myserver -d mydb -o outputfile
我在这样的批处理文件中确认:
set inputdate='2019-04-29'
sqlcmd -Q "print $(inputdate)" -S myserver -E
答案 4 :(得分:0)
您可能会缺少用双引号引起来的日期。 相当于Powershell的是:
# Dates
$dates = @(
'2019-04-29'
)
$dates | ForEach-Object {
# Date
$inputdate = $_
# Command to run
$cmd = "DECLARE @refdate as datetime; set @refdate = try_cast ('$inputdate' as date) ; exec sp_mysp @refdate "
$args = @(
'-Q'
$cmd
'-S'
'myserver'
'-d'
'mydb'
'-o'
'outputfile'
)
Write-Host "Running : $cmd "
& 'sqlcmd' $args
}