这在批处理中起作用:
sqlcmd -Q "exec sp_mysp @refdate = '2019-04-29'" -S myserver -d mydb -o C:myfolderresult.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'
当 set
带有值的ting变量时,您需要考虑如何用Windows cmd
示例:
set variable = value
这将从variable
的开头解释到value
的末尾,因此给出上面的示例,您现在具有%variable %
的变量(请注意尾随的空间(和value
的值(请注意领先的Whitespace(。因此,如果您尝试使用echo %variable%
,它将返回%variable%
,因为该变量永远不会设置,echo %variable %
将返回一个值,但仍在我们不想要的领先空间中。
因此,您需要在变量和=
之间没有空格,并且=
与该值之间没有空格。另外,最好将整个变量字符串包裹在双引号中,以确保您对该值没有落后的空格,因此最后,您需要做:
set "inputdate='2019-04-29'"
我认为您可能会尝试设置诸如set inputdate='2019-04-29'
的批处理变量。
也许这会有所帮助:
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
)
此批处理命令在每个日期(每行一个日期(中迭代textfile.txt,该textfile.txt位于与您的.bat文件相同的文件夹中,并为每个条目执行您的代码。
我认为这就是您想要的:
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
您可能会缺少双引号来包装日期。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
}