Sql server Powershell使用SqlBulkCopy插入数据表,其中包含日期时间列
我正在尝试使用Sql server Powershell使用SqlBulkCopy插入数据表,其中包含日期时间列,sql-server,powershell,datetime,datatable,sqlbulkcopy,Sql Server,Powershell,Datetime,Datatable,Sqlbulkcopy,我正在尝试使用Data.SqlClient.SqlBulkCopy将预定义的DataTable插入SQL Server数据库 DataTable中有不同的数据类型,但问题在于Datetime列 像这个: $Datatable.Columns.Add((New-Object System.Data.DataColumn 'mydate',([datetime]))) 我在专栏里有数据,对我来说,它看起来不错 比如,如果我尝试$row.mydate.Month我会得到我期望的月份 因此,看起来da
Data.SqlClient.SqlBulkCopy
将预定义的DataTable
插入SQL Server数据库
DataTable
中有不同的数据类型,但问题在于Datetime
列
像这个:
$Datatable.Columns.Add((New-Object System.Data.DataColumn 'mydate',([datetime])))
我在专栏里有数据,对我来说,它看起来不错
比如,如果我尝试$row.mydate.Month
我会得到我期望的月份
因此,看起来datatable中填充了正确的数据
但是当我跑的时候
$bulkCopy.WriteToServer($DataTable)
我得到这个错误:
数据源中类型字符串的给定值无法转换为指定目标列的类型datetime
所以这是我第一件不明白的事。为什么它说我的数据类型是字符串,而它是datetime。SqlBulkCopy
是否将所有数据转换为字符串
我试图直接在数据库中重现这个问题,这就是我得到的结果
它与日期的格式有关。我无法插入此'22-02-2017'
。但是我可以插入这个'02-22-2017'
因此,datetime类型显然存在一些混乱
为什么SqlBulkCopy
尝试将“22”插入为月而不是日,因为数据表中的数据显然是正确的
我想这可能是一种文化。但数据库文化和我的工作站文化似乎是一致的。但是,我确实尝试更改Powershell脚本的文化,如下所示:
function Set-Culture([System.Globalization.CultureInfo] $culture)
{
[System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture
[System.Threading.Thread]::CurrentThread.CurrentCulture = $culture
}
$culture = [System.Globalization.CultureInfo]::GetCultureInfo('en-US')
Set-Culture $culture
当我将数据写入控制台时,这会切换日期和月份,但不会影响BulkCopy错误
你们知道发生了什么吗?你们的数据集序列必须等于表列序列
CREATE TABLE [dbo].[tmp](
[IP] [varchar](16) NOT NULL,
[USER] [nvarchar](50) NOT NULL,
[DT] [date] NOT NULL
PS> $DataSet
IP User DT
-- ---- --
172.16.11.11 SysCopyUser 2017-05-11 15:29:29