【发布时间】: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