sql - 使用 Powershell 插入 SQL Server 日期
问题描述
我正在使用 PowerShell 导入.CSV
文件,我需要将其内容保存到数据库中。
我正在使用下面的代码从.CSV
文件中提取信息,并将其放入数据库
foreach($row in $data) {
$sql = "INSERT INTO Offerings (RATING, PARVALUE, DESCRIPTION, COUPON, MATURITY, DATEDDATE, CALLDATE, FIRSTCOUPON, CUSIP, PRICEYIELD, COM) VALUES( `
'$(($row.rating).trim())', `
'$(($row."PAR VALUE").trim())',`
'$(($row.DESCRIPTION).trim())', `
'$(($row.COUPON).trim())', `
'$(($row.MATURITY))', `
'$(([datetime]$row."DATED DATE"))', `
'$(($row."CALL DATE").trim())', `
'$(($row."FIRST COUPON"))', `
'$(($row.CUSIP).trim())', `
'$(($row."PRICE/YIELD").trim())',`
'$(($row.COM).trim())' `
)"
$command.CommandText = $sql
$command.ExecuteNonQuery() | out-null
}
列$row.MATURITY
/$row."CALL DATE"
和$row."FIRST COUPON"
都是日期(数据库中的列是类型DATE
)。
但是插入将其作为字符串传递,数据库抱怨它无法将字符串转换为 DATE。如何在 PowerShell 命令中将其作为日期传递,以便正确写入数据库(作为DATE
类型)?
谢谢!
解决方案
字符串连接是一个非常糟糕的主意。它不仅会向 SQL 注入打开您的代码,而且非常脆弱。
使用参数化查询。假设您使用的是 SQL Server:
$sql = "INSERT INTO Offerings (RATING, PARVALUE, DESCRIPTION, COUPON, MATURITY, DATEDDATE, CALLDATE, FIRSTCOUPON, CUSIP, PRICEYIELD, COM) " +
"VALUES (@RATING, @PARVALUE, @DESCRIPTION, @COUPON, @MATURITY, @DATEDDATE, @CALLDATE, @FIRSTCOUPON, @CUSIP, @PRICEYIELD, @COM)"
$command.CommandText = $sql
# Add your parameters and define their types to match the types in the Offerings table
# The System.Data.SqlDbType type includes all SQL Server data types
# For data type mapping, see https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings
[void]$command.Parameters.Add('@RATING', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@PARVALUE', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@DESCRIPTION', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@COUPON', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@MATURITY', [System.Data.SqlDbType]::Date)
[void]$command.Parameters.Add('@DATEDDATE', [System.Data.SqlDbType]::Date)
[void]$command.Parameters.Add('@CALLDATE', [System.Data.SqlDbType]::Date)
[void]$command.Parameters.Add('@FIRSTCOUPON', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@CUSIP', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@PRICEYIELD', [System.Data.SqlDbType]::NVarChar)
[void]$command.Parameters.Add('@COM', [System.Data.SqlDbType]::NVarChar)
# I've defaulted to NVARCHAR here, but you should use the appropriate column data type
foreach ($row in $data) {
# Set the values of each parameter
$command.Parameters['@RATING'].Value = $row.rating.trim()
$command.Parameters['@PARVALUE'].Value = $row."PAR VALUE".trim()
$command.Parameters['@DESCRIPTION'].Value = $row.DESCRIPTION.trim()
$command.Parameters['@COUPON'].Value = $row.COUPON.trim()
$command.Parameters['@MATURITY'].Value = [datetime]$row.MATURITY
$command.Parameters['@DATEDDATE'].Value = [datetime]$row."DATED DATE"
$command.Parameters['@CALLDATE'].Value = [datetime]$row."CALL DATE"
$command.Parameters['@FIRSTCOUPON'].Value = $row."FIRST COUPON"
$command.Parameters['@CUSIP'].Value = $row.CUSIP.trim()
$command.Parameters['@PRICEYIELD'].Value = $row."PRICE/YIELD".trim()
$command.Parameters['@COM'].Value = $row.COM.trim()
[void]$command.ExecuteNonQuery()
}
如果您使用的 RDBMS 与 SQL Server 不同,您的代码可能会略有不同。
如果您在将字符串转换$row
为日期时间时遇到问题,可以使用 ParseExact 函数:
$command.Parameters['@MATURITY'].Value = [datetime]::ParseExact($row.MATURITY, 'dd.MM.yyyy', [cultureinfo]::InvariantCulture)
或者你可以使用Get-Date
$command.Parameters['@MATURITY'].Value = Get-Date $row.MATURITY -Format 'dd.MM.yyyy'
参数化查询唯一复杂的部分是,如果您需要在数据库中将值设置为 NULL,那么参数的值需要是[System.DBNull]::Value
,而不是$null
。
推荐阅读
- python - 如何将 2D 和 1D 类(分别为单热编码和常规整数)的混合输入到 Keras 序列模型中?
- java - android - java.lang.ArrayIndexOutOfBoundsException:长度=4;index = 4长度数组 - Thinbug
- marklogic - 使用管理 API 在 MarkLogic 9.2 上设置元数据字段
- django - 在 Django 默认环境之外的数据库中替换/更改文件路径
- portal - 我可以从 TFS/VSTS 发布 Dynamics 365 门户页面吗
- php - 如何在 Laravel 中将元字段添加到 Eloquent 模型对象的集合中
- hibernate - HQL 奇怪的行为
- opengl - 如何将 opengl 用于 nana c++ 库?
- c++ - 为什么找不到我的着色器属性?
- optimization - 确切的 Broadcom B43 驱动程序