Я недавно играл с этой проблемой.В моем случае у меня были переменные с точками и пробелами внутри.Я перечислю все комбинации, которые я пытался запустить.
Тестовый файл SQL test.sql
declare @testvar varchar(30);
set @testvar = '$(testvar)';
print @testvar;
Набор моих тестовых переменных:
$varA = 'Abc1.3,Abc4.3' # contains only dots
$varB = 'A bc1.3,Ab c4.3' # contains dots and spaces
$varC = 'xx x.yy,y,.1.2.,3 , y' # contains dots and multiple spaces
Тестирование sqlcmd команда
sqlcmd -v testvar=`"$var`" -i test.sql
sqlcmd -v testvar=($var) -i test.sql
sqlcmd -v testvar=("""$var""") -i test.sql # Solution by Andrei Shakh
a) Тест # 1
Сначала я обнаружил, что мой скрипт powershell возвращает ошибку для переменной, содержащей пробелы
sqlcmd -v testvar=`"$varA`" -i test.sql
Abc1.3,Abc4.3
sqlcmd -v testvar=`"$varB`" -i test.sql
sqlcmd : Sqlcmd: 'testvar="A bc1.3,Ab c4.3""': Invalid argument. Enter '-?' for help. At line:2 char:1
b) Тест № 2
Наконец-то найдено решение заменить переменную скобками вместо двойных кавычек, НО!
sqlcmd -v testvar=($varA) -i test.sql
sqlcmd : Sqlcmd: ',Abc4.3': Invalid argument. Enter '-?' for help. At line:1 char:1
sqlcmd -v testvar=($varB) -i test.sql
A bc1.3,Ab c4.3
Интересно, что я обнаружил, что это решениене работает с точками в моих переменных.
c) Тест # 3
Я создал скрипт для сопоставления пробела в переменной и в этом случае использовал круглые скобки, которые работают в обоих направлениях.
If ($var -match " ") # or ($var -like "* *")
{
sqlcmd -v testvar=($var) -i test.sql
}
Else
{
sqlcmd -v testvar=`"$var`" -i test.sql
}
d) Окончательное решение
На сегодняшний день лучшим решением, которое я нашел, был ответ Андрей Шах , который работает со всем без использования государственных деятелей IF / ELSE дляпроверьте, есть ли место в строке или нет.
sqlcmd -v testvar=("""$varA""") -i test.sql
Abc1.3,Abc4.3
sqlcmd -v testvar=("""$varB""") -i test.sql
A bc1.3,Ab c4.3
sqlcmd -v testvar=("""$varC""") -i test.sql
xx x.yy,y,.1.2.,3 , y