【问题标题】:Update or Insert SQL with Powershell NULL values使用 Powershell NULL 值更新或插入 SQL
【发布时间】:2019-09-23 11:34:16
【问题描述】:

如果值不存在,尝试找出如何添加 MSSQL-Null 值。

到目前为止,这有效,它将插入新行,如果匹配,它将更新列。 但是如果没有指定终止日期,而不是在数据库中分配一个空值,它将写入 1900-01-01 并且文本字段将为空白而不是空。

尝试添加 +[DBNull]::Value 但未做任何更改。 有点没主意了。 :)

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()

【问题讨论】:

  • 不要通过文本连接构造查询——我知道这在 PowerShell 中特别方便,但它会自找麻烦。使用正确的参数化查询——SET first_name = @firstname$SQLCmd.Parameters.Add("@firstname", "NVarChar", 100).Value = &{ if (-not $user.fname) { [DBNull]::Value } else { $user.fname } }。这假设您要将所有空字符串转换为NULL,但逻辑很容易定制。

标签: sql sql-server powershell sql-null


【解决方案1】:

您可以尝试在将 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)。然后只需在 switch 块之后添加您的 SQL 代码。

【讨论】:

    【解决方案2】:

    好的,我想我现在明白了:)

    $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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 2011-01-17
      • 2017-12-29
      • 1970-01-01
      • 2019-09-29
      相关资源
      最近更新 更多