Я вижу несколько вопросов.
Во-первых, ваш запрос SQL имеет END
, но не BEGIN
. Если вы хотите IF EXISTS
, тогда должно быть либо:
IF EXISTS (SELECT [image_client] FROM [dbo].[clients] WHERE [client_do] = $Row.client_do) BEGIN SELECT [image_client] FROM [dbo].[clients] WHERE [client_do] = $Row.client_do END
Или вы можете полностью опустить блок BEGIN...END
, если выполняете только один оператор:
IF EXISTS (SELECT [image_client] FROM [dbo].[clients] WHERE [client_do] = $Row.client_do) SELECT [image_client] FROM [dbo].[clients] WHERE [client_do] = $Row.client_do
Однако, строго говоря, вам не нужен IF EXISTS
вообще. Вы просто заставляете механизм запросов выполнять больше работы, и единственное отличие состоит в том, что вы не получите никакого набора результатов вообще вместо пустого набора результатов, который не сильно отличается в том, что касается SqlDataReader. Наверное, вам следует просто позвонить:
SELECT [image_client] FROM [dbo].[clients] WHERE [client_do] = $Row.client_do
А затем обработать это в вашем скрипте, если у вас есть пустой набор результатов. Однако я не уверен, что это потребует каких-либо изменений в коде.
Далее, вы не можете вызывать свойства встроенных переменных, как вы. Если $Row.client_do
равно 12, то "$Row.client_do"
вернет что-то вроде [DataRow].client_do
. Синтаксический анализатор PowerShell не распознает внедренный период как оператор точки. Вам нужно использовать подвыражение типа "$($Row.client_do)"
. Таким образом, ваш запрос должен быть:
$query = "IF EXISTS (SELECT [image_client] FROM [dbo].[clients] WHERE [client_do] = $($Row.client_do)) BEGIN SELECT [image_client] FROM [dbo].[clients] WHERE [client_do] = $($Row.client_do) END"
Или:
$query = "IF EXISTS (SELECT [image_client] FROM [dbo].[clients] WHERE [client_do] = {0}) BEGIN SELECT [image_client] FROM [dbo].[clients] WHERE [client_do] = {0} END" -f $Row.client_do
В-третьих, в вашей функции эта строка не имеет смысла:
$Reader.GetValue($1)
$1
- переменная без значения. Вы фактически звоните $Reader.GetValue($null)
, то есть система, по сути, звонит $Reader.GetValue(([int]$null))
. Это работает только потому, что [int]$null
- это 0
, но это выглядит совершенно случайно. Это должно быть просто:
$Reader.GetValue(0)
Наконец, вся ваша методология использует конкатенацию строк для построения строк запроса. Это означает, что вы уязвимы для внедрения SQL. Если это одноразовый скрипт, это хорошо, но если вы собираетесь использовать этот скрипт несколько раз, тогда я настоятельно рекомендую использовать параметризованные запросы.
Редактировать: На самом деле, я заметил кое-что еще. Ваш цикл не имеет смысла, и вы вызываете функцию неправильно.
ForEach ($Row in $Csv) {
$query = ...
$imagefile = GenericSqlQuery($sqlserver,$DB,$query)
$i += 1
}
Вы перезаписываете $imagefile
на каждой итерации. а потом ничего не делать с этим.
Также GenericSqlQuery($sqlserver,$DB,$query)
не работает так, как вы думаете. Как написано, это звонит GenericSqlQuery -Server ($sqlserver,$DB,$query) -Database $null
-SQLQuery $null
. Это одна из самых больших ошибок PowerShell. Это должно быть GenericSqlQuery $sqlserver $DB $query
или GenericSqlQuery -Server $sqlserver -Database $DB -SQLQuery $query
.
Ваш цикл и конец скрипта выглядят примерно так:
ForEach ($Row in $Csv) {
$query = ...
$imagefile = GenericSqlQuery -Server $sqlserver -Database $DB -SQLQuery $query
$row.image_client = $imagefile -join ','
$i += 1
}
$Csv | Export-Csv -Path "exportfilename.csv" -NoTypeInformation