将变量从'list'传递到.bat文件中的sqlcmd



这在批处理中起作用:

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
}

最新更新