使用 Powershell NULL 值更新或插入 SQL
Update or Insert SQL with Powershell NULL values
试图弄清楚如何在值不存在时添加 MSSQL-Null 值。
这到目前为止有效,它将插入新行,如果匹配,它将更新列。
但是,例如,如果未指定 termniationdate,它不会在数据库中分配空值,而是写入 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()
您可以尝试在将 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
这将在匹配 [=22= 的循环中创建变量($id
、$firstname
、$lastname
、$middlename
、$terminationdate
) ] 名字。然后只需在开关块后添加 SQL 代码即可。
好的,我想我现在明白了:)
$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()
试图弄清楚如何在值不存在时添加 MSSQL-Null 值。
这到目前为止有效,它将插入新行,如果匹配,它将更新列。 但是,例如,如果未指定 termniationdate,它不会在数据库中分配空值,而是写入 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()
您可以尝试在将 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
这将在匹配 [=22= 的循环中创建变量($id
、$firstname
、$lastname
、$middlename
、$terminationdate
) ] 名字。然后只需在开关块后添加 SQL 代码即可。
好的,我想我现在明白了:)
$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()