Невозможно вставить значения таблицы SQL из Powershell в SQL Server

#sql-server #powershell

#sql-сервер #powershell

Вопрос:

Скрипт получает данные из API, и я пытаюсь импортировать эти данные в SQL Server с помощью PowerShell.

 $params = @{
    ServerInstance = "SQLDB1"
    Database="Stage"
}

$InsertResults = @"
INSERT INTO [Stage].[dbo].[ImportTable]([roleID],[roleName])
VALUES ('$roleId','$rolename')
"@

foreach($r in $roles) {
    [int]$roleId = $r.id
    $rolename = $r.name
    Invoke-sqlcm @params -Query $InsertResults }
 

Здесь API выдает r в ролях, которые могут быть r.id (числовое значение, которое я преобразую в int) или r.name , строковое значение, с целью поместить их в одну таблицу рядом друг с другом, [RoleId][RoleName]

Ну, это и есть цель. При проверке таблицы в SQL Server все, что я получаю, это

 |roleID|roleName|
-----------------
|  0   |        |
 

Это если я установлю RoleId в значение Primary Key . Если я этого не сделаю, он повторяет одну и ту же строку столько раз, сколько строк данных содержится в API. Если я не включу «$rolename = $r.name » тогда в столбце RoleName просто написано «.name», и все.

То, что мне нужно, выглядит так

 |roleID|roleName|
-----------------
|  1   |  role1  |
|  2   |  role2  |
|  3   |  role3  |
 

и т.д.

Ответ №1:

В вашем коде я вижу некоторую логическую ошибку:

Вы определяете строку запроса с неинициализированными параметрами вне цикла запроса. Итак, ваша строка запроса никогда не обновляется корректно (ожидаемо), и вы видите, что после выполнения командлета значения по умолчанию для int равны 0, а string равны NULL (пустая строка).

Таким образом, правильный код будет

 foreach($r in $roles) {
$InsertResults = @"
INSERT INTO [Stage].[dbo].[ImportTable]([roleID],[roleName])
VALUES ('$roleId','$rolename')
"@
    [int]$roleId = $r.id
    $rolename = $r.name
    Invoke-sqlcmd @params -Query $InsertResults }
 

Я создал массив для тестирования

 $roles = @([pscustomobject]@{id=5; name ="test2"},[pscustomobject]@{id = 6;name ="test"})
 

Я протестировал ваш код и увидел этот результат

 |roleID|roleName|
-----------------
|  6   |  test  |
|  6   |  test  |
 

После изменения строки запроса инициализации (внутренний цикл) я увидел

 |roleID|roleName|
-----------------
|  5   |  test2 |
|  6   |  test  |
 

Ваш код также может быть изменен следующим образом:

 $InsertResults = @"
INSERT INTO [Stage].[dbo].[ImportTable]([roleID],[roleName])
VALUES (`$(roleId),`$(rolename))
"@

foreach($r in $roles) {

$variables = @(
  "roleId=$($r.id)",
  "rolename='$($r.name)'"
)    
    Invoke-sqlcmd @params -Query $InsertResults -Variable $variables}
 

Комментарии:

1. Интересно. Я ценю ваш ответ. Я попробую и посмотрю, что из этого получится.