Powershell -invoke sql с символьным параметром - PullRequest
2 голосов
/ 23 января 2020

У меня есть код, который читает файл Excel и ищет значение в базе данных sql. Это часть кода:

    for ($i=1; $i -le $rowMax-1; $i++)
    { 
        $name = $sheet.Cells.Item($rowName+$i,$colName).text 
        $mail = $sheet.Cells.Item($rowMail+$i,$colMail).text 
        #test   $Query = ‘ SELECT  * FROM dbo.tbl1 where value = ‘ + “‘” +$mail + “‘”
        $Query = ‘ SELECT  * FROM dbo.tbl1 where id = 3’ 

        Invoke-Sqlcmd -serverinstance $DatabaseServerName -Database $Database -Username $Uid -Password $Pwd -query $Query   -ErrorAction Stop

        Write-Host ("My Name is: "+$name)
        Write-Host ("My mail is: "+$mail)
        Write-Host $query
    }
    #close excel file
    $objExcel.quit()

Если я сделаю запрос с номером (SELECT * FROM dbo.tbl1 where id = 3), все будет в порядке:

id           : 3
className    : PersonBase
keyValue     : 3
typeCd       : 6
value        : karen.g@hotmail.com
description  :
usermodify   :
datemodify   :
My Name is: G Karen
My mail is: karen.g@hotmail.com
 SELECT  * FROM dbo.tbl1 where id = 3

Если я выполню запрос:

$Query = ‘ SELECT  * FROM dbo.tbl1 where value = ‘ + “‘” +$mail + “‘”

Я получаю эту ошибку:

Invoke-Sqlcmd: неправильный синтаксис рядом с '' '. Сообщение 102, Уровень 15, Состояние 1, Процедура, Строка 1. В строке: 8 символов: 1 + Invoke-Sqlcmd -serverinstance $ DatabaseServerName -Database $ Database ... + ~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~ + CategoryInfo: InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException + FullyQualifiedErrorId: SqlError, Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

1015

1016 , вывод выглядит нормально. Я могу вставить его на сервер, и оператор выбора работает нормально:

My Name is: G Karen
My mail is: karen.g@hotmail.com
 SELECT  * FROM dbo.tbl1 where value = 'karen.g@hotmail.com'

Что не так?

1 Ответ

0 голосов
/ 23 января 2020

PowerShell с радостью принимает кавычки Unicode (не в диапазоне ASCII) вместо обычных, в диапазоне ASCII - см. Этот ответ

Например, как в вашем коде:

  • (ЛЕВАЯ ОДНОКВАЖНАЯ КАРТА, U+2018) может использоваться вместо ASCII-диапазона ' (APOSTROPHE, U+0027), также известный как одинарная кавычка .

  • (СЛЕДУЮЩАЯ ДВОЙНАЯ КВАРТИРА, U+201C) может быть используется вместо ASCII-диапазона " (МАРКА ЦИТАТЫ, U+0022), иначе двойная кавычка .

Для контраста , Я подозреваю, SQL Сервер не подозревает эти замены , поэтому вам придется использовать ASCII-диапазон ' и " для кавычек встраивается в ваши запросы .

Поэтому немедленное исправление:

$Query = ‘ SELECT  * FROM dbo.tbl1 where value = ‘ + “'” +$mail + “'”

Обратите внимание, как только символы внутри “...” были изменены с на '; внешнее цитирование, которое интерпретируется - и удаляется - с помощью PowerShell может продолжать использовать кавычки не из диапазона ASCII.


Однако вы можете более просто использовать расширяемая строка ("...") с встроенными ссылками на переменные:

$Query = " SELECT  * FROM dbo.tbl1 where value = '$mail'"

Обратите внимание, что я также переключил внешние двойные кавычки к их версиям ASCII-диапазона. Как правило, даже в PowerShell придерживаться обычных кавычек в диапазоне ASCII , чтобы не возникало проблем из-за кодировки символов при совместном использовании кода.

...