#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. Интересно. Я ценю ваш ответ. Я попробую и посмотрю, что из этого получится.