Обновить или вставить SQL со значениями Powershell NULL - PullRequest
0 голосов
/ 23 сентября 2019

Попытка выяснить, как добавить значение MSSQL-Null, если значение отсутствует.

Пока это работает, оно вставит новые строки и, если совпадение, обновит столбцы.Но если, например, termniationdate не указан, вместо назначения нулевого значения в базе данных будет записано 1900-01-01, а текстовые поля будут пустыми, а не нулевыми.

Попытка добавить + [DBNull]:: Значение, но без изменений.Вроде кончились идеи.:)

USERS.CSV:

id,firstname,lastname,middlename,terminationdate
1,A,B,,
2,C,D,E,2019-10-12
3,F,G,,2019-11-12
4,H,I,J,
5,K,,,
$users=Import-csv C:\temp\users.csv

$SQLServer = "localhost\DB"
$SQLDBName = "UDB"
$SQLTableName="dbo.users"

$SQLConn = New-Object System.Data.SQLClient.SQLConnection
$SQLCmd = New-Object System.Data.SQLClient.SQLCommand

$SQLConn.ConnectionString = "Server=$SQLServer;Database=$SQLDBName; Integrated Security= True"
$SQLConn.Open()

$SQLCmd = New-Object System.Data.SqlClient.SqlCommand
$SQLCmd.Connection = $SQLConn

foreach ($user in $users){

#declare the variables
$id = $user.id
$first_name = $user.fname
$last_name = $user.lastname
$middle_name = $user.middlename
$termination_date = $user.terminationdate

$SQLCmd.CommandText = "
IF EXISTS (SELECT * FROM $SQLTableName WHERE id = '$id')
BEGIN
    UPDATE
        $SQLTableName
    SET
    first_name = '$firstname',
    last_name = '$lastname',
    middle_name = '$middlename',
    date_termination = '$terminationdate',
    WHERE
        id = $ID 
END
ELSE
BEGIN
    INSERT INTO 
    $SQLTableName(
    id,
    first_name,
    last_name,
    middle_name,
    termination_date)
    VALUES
    ('$id',       
    '$firstname',
    '$lastname',
    '$middlename',
    '$terminationdate')      
    END"

$SQLCmd.ExecuteNonQuery()

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Вы можете попробовать обнулить значения объекта CSV до того, как они будут переданы в команду SQL.

foreach ($user in $users){

  switch ('id','firstname','lastname','middlename','terminationdate') {
    {[string]::IsNullOrEmpty($user.$_)} {
        Set-Variable $_ -Value $null -Force
        Break
    }
    default {
        Set-Variable $_ -Value $user.$_ -Force
    }
  } # End switch

  # SQL Stuff
} # End foreach loop

Это создаст переменные ($id, $firstname, $lastname, $middlename, $terminationdate) в цикле, которые соответствуют именам свойств.Затем просто добавьте свой код SQL после блока переключателей.

0 голосов
/ 23 сентября 2019

Хорошо, я думаю, что понял сейчас:)

$users=Import-csv C:\temp\users.csv

$SQLServer = "localhost\DB"
$SQLDBName = "UDB"
$SQLTableName="dbo.users"

$SQLConn = New-Object System.Data.SQLClient.SQLConnection
$SQLCmd = New-Object System.Data.SQLClient.SQLCommand

$SQLConn.ConnectionString = "Server=$SQLServer;Database=$SQLDBName; Integrated Security= True"
$SQLConn.Open()

$SQLCmd = New-Object System.Data.SqlClient.SqlCommand
$SQLCmd.Connection = $SQLConn

foreach ($user in $users){
$SqlCmd.Parameters.Clear()

$SQLCmd.CommandText = "
IF EXISTS (SELECT * FROM $SQLTableName WHERE id = @id)
BEGIN
    UPDATE
        $SQLTableName
    SET
    first_name = @firstname,
    last_name = @lastname,
    middle_name = @middlename,
    termination_date = @terminationdate,
    WHERE
        id = @id 
END
ELSE
BEGIN
    INSERT INTO 
    $SQLTableName(
    id,
    first_name,
    last_name,
    middle_name,
    termination_date)
    VALUES
    (@id,       
    @firstname,
    @lastname,
    @middlename,
    @terminationdate)      
    END"

$SQLCmd.Parameters.Add("@id", [System.Data.SqlDbType]::Int).Value = $user.id
$SQLCmd.Parameters.Add("@firstname", [System.Data.SqlDbType]::NVarChar).Value = $user.fname+[DBNull]::Value
$SQLCmd.Parameters.Add("@lastname", [System.Data.SqlDbType]::NVarChar).Value = $user.lastname+[DBNull]::Value
$SQLCmd.Parameters.Add("@middlename", [System.Data.SqlDbType]::NVarChar).Value = $user.middlename+[DBNull]::Value
$SQLCmd.Parameters.Add("@terminationdate", [System.Data.SqlDbType]::Date).Value = $user.terminationdate+[DBNull]::Value

$SQLCmd.ExecuteNonQuery()
0 голосов
/ 23 сентября 2019

SQL Server преобразует пустую строку в 1900-01-01.Предполагая, что $termination_date содержит пустую строку для некоторых строк, вы можете обработать это с помощью функции NULLIF:

UPDATE $SQLTableName SET
first_name       = '$firstname',
last_name        = '$lastname',
middle_name      = '$middlename',
date_termination = NULLIF('$terminationdate', ''),
WHERE id = $ID

Сказав это, я бы предложил использовать подготовленные операторы вместо строкиинтерполяция.Ваш код просто потерпит неудачу, если CSV содержит имя, такое как O'Brien.

...