Sql server 如何将正确的datetime对象发送到powershell中的SQL Server?

Sql server 如何将正确的datetime对象发送到powershell中的SQL Server?,sql-server,powershell,Sql Server,Powershell,我浏览了互联网,到目前为止,没有一个答案能提供我所能使用的任何东西 我在使用powershell将简单的日期时间导入SQL Server数据库时遇到了严重问题 该列的类型为“datetime”,语言为en-US 列值中的内容示例如下 2009-09-16 00:00:00.000 我尝试将同一日期发送到powershell中的数据库,我尝试的所有操作都返回了 "Conversion failed when converting date and/or time from character st

我浏览了互联网,到目前为止,没有一个答案能提供我所能使用的任何东西

我在使用powershell将简单的日期时间导入SQL Server数据库时遇到了严重问题

该列的类型为
“datetime”
,语言为
en-US

列值中的内容示例如下

2009-09-16 00:00:00.000

我尝试将同一日期发送到powershell中的数据库,我尝试的所有操作都返回了

"Conversion failed when converting date and/or time from character string."
错误

这是我的powershell脚本:

$dateString = "2009-09-16 00:00:00.000"
$id = '12345'
$nd  = Get-Date $dateString -Format "yyyy-MM-dd HH:mm:ss:fff"
$query = "Update MyTable Set CreateDate = '@e1' Where ID = '@e2'"
$SqlCmd.Parameters.Clear()
$parm = $SqlCmd.Parameters.Add("@e1", $nd)
$SqlCmd.Parameters.Add("@e2" , $id)
$SqlCmd.CommandText = $query
$SqlCmd.ExecuteNonQuery()
我曾尝试对变量使用
[datetime]
,但它总是将所查看的字符串转换为与上面所需格式不同的格式,因此失败

其他一切,不管它看起来是否正确,都会因为错误的类型而失败


是否有语法可以获取插入/更新所需的内容

Hum,在数据库中搜索带有字符串连接的查询总是很危险的。但是,不建议使用这种方法,因为它容易受到SQL注入攻击

但你可以试试这个:

$query = "Update MyTable Set CreateDate = @e1 Where ID = '@e2'"
$SqlCmd.Parameters.Clear()
$SqlCmd.Parameters.Add("@e1", [System.Data.SqlDbType]::DateTime)
$param1.Value=(Get-Date -Year 2009 -Month 9 -Day 16 "yyyy-MM-dd HH:mm:ss:fff").Date
$SqlCmd.Parameters.Add("@e2" , $id)
$SqlCmd.CommandText = $query
$SqlCmd.ExecuteNonQuery()
或者可能是:

$id = '12345'
$dateString = "2009-09-16 00:00:00.000"
$query = "Update MyTable Set CreateDate = convert(datetime, '@e1', 121)  Where ID = '@e2'"
$SqlCmd.Parameters.Clear()
$SqlCmd.Parameters.Add("@e1", $dateString)
$SqlCmd.Parameters.Add("@e2" , $id)
$SqlCmd.CommandText = $query
$SqlCmd.ExecuteNonQuery()
添加(字符串、对象)
不要使用此方法,因为系统会猜测使用哪种数据类型,并且通常会假定它是字符串。使用或代替(后者是在需要指定长度时,例如使用
varchar(10)

在这里,我会用这个:

$SqlCmd.Parameters.Add("@e1", [System.Data.SqlDbType]::DateTime).Value = $nd
$SqlCmd.Parameters.Add("@e2", [System.Data.SqlDbType]::Int).Value = $id
请注意,此处第二个值应使用实际数据类型。我只是猜测它是一个
int
。具有所有常见SQL Server数据类型的数据类型

此外,您的查询不正确。您不想引用参数。与此相反:

$query = "Update MyTable Set CreateDate = '@e1' Where ID = '@e2'"
具体说明:

$query = "Update MyTable Set CreateDate = @e1 Where ID = @e2"
我还建议使用更具描述性的参数名称。没有理由不使用
@CreateDate
@id

最后,它根本不返回datetime,只返回另一个字符串:

$nd  = Get-Date $dateString -Format "yyyy-MM-dd HH:mm:ss:fff"
-Format
参数指定字符串的输出格式

这是我将使用的代码:

$dateString = "2009-09-16 00:00:00.000"
$id = '12345'
$nd  = Get-Date $dateString

$ConnectionString = ...
$query = "Update MyTable Set CreateDate = @CreateDate Where ID = @id"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection -ArgumentList $ConnectionString
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand -ArgumentList $query, $SqlConnection
$SqlCmd.Parameters.Add("@CreateDate", [System.Data.SqlDbType]::DateTime).Value = $nd
$SqlCmd.Parameters.Add("@id", [System.Data.SqlDbType]::Int).Value = $id

try {
    $SqlConnection.Open()
    $RecordsAffected = $SqlCmd.ExecuteNonQuery()
    Write-Host "$RecordsAffected row(s) updated."
}
finally {
    $SqlConnection.Close()
}

最简单的方法是使用ISO 8601中定义的非分离语言中性格式
YYYYMMDD hh:mm:ss[.mmm]
YYYY-mm-DDThh:mm:ss[.nnnnn]
。这两种格式都不受SET LANGUAGE和SET DATEFORMAT会话区域设置的影响。更多信息请参见Tibor Karaszi的文章。
$dateString = "2009-09-16 00:00:00.000"
$id = '12345'
$nd  = Get-Date $dateString

$ConnectionString = ...
$query = "Update MyTable Set CreateDate = @CreateDate Where ID = @id"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection -ArgumentList $ConnectionString
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand -ArgumentList $query, $SqlConnection
$SqlCmd.Parameters.Add("@CreateDate", [System.Data.SqlDbType]::DateTime).Value = $nd
$SqlCmd.Parameters.Add("@id", [System.Data.SqlDbType]::Int).Value = $id

try {
    $SqlConnection.Open()
    $RecordsAffected = $SqlCmd.ExecuteNonQuery()
    Write-Host "$RecordsAffected row(s) updated."
}
finally {
    $SqlConnection.Close()
}