Передать переменную из списка в sqlcmd в файле .bat - PullRequest
4 голосов
/ 10 мая 2019

Это работает в пакетном файле:

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'

Удаление '%' вокруг inputdate дает сообщение об ошибке: Incorrect syntax near 'inputdate'

И использование @inputdate выдает ошибку: Incorrect syntax near '@inputdate'

Ответы [ 5 ]

1 голос
/ 10 мая 2019

Когда set связывает переменные со значениями, вам необходимо учитывать, как они интерпретируются Windows cmd

Пример:

set variable = value

Это будет интерпретироваться от начала variable до конца value Итак, приведенный выше пример, теперь у вас есть переменная %variable % (обратите внимание на конечный пробел) и значение value (примечание ведущие пробелы). Поэтому, если вы попытаетесь echo %variable%, он вернет %variable%, так как переменная никогда не была установлена, где echo %variable % вернет значение, но все еще с начальным пробелом, который нам не нужен.

Следовательно, между переменной и = не должно быть пробелов, а между = и значением не должно быть пробелов. Кроме того, лучше всего обернуть всю переменную строку в двойные кавычки, чтобы убедиться, что у вас нет конечных пробелов в значении, поэтому, наконец, вам нужно будет сделать:

 set "inputdate='2019-04-29'"
1 голос
/ 10 мая 2019

Может быть, это поможет:

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, который находится в той же папке, что и ваш файл .bat, и выполняетВаш код для каждой записи.

1 голос
/ 10 мая 2019

Я думаю, вы можете попытаться установить пакетные переменные, такие как set inputdate='2019-04-29'.

0 голосов
/ 10 мая 2019

Возможно, вам не хватает двойных кавычек для переноса даты. Эквивалент 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
}
0 голосов
/ 10 мая 2019

Я думаю, это то, что вы хотите:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...