Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在使用SqlBulkCopy插入sql\u变量列时,如何设置列类型_Sql Server_Ado.net_Datatable_Sqlbulkcopy_Sql Variant - Fatal编程技术网

Sql server 在使用SqlBulkCopy插入sql\u变量列时,如何设置列类型

Sql server 在使用SqlBulkCopy插入sql\u变量列时,如何设置列类型,sql-server,ado.net,datatable,sqlbulkcopy,sql-variant,Sql Server,Ado.net,Datatable,Sqlbulkcopy,Sql Variant,我正在使用SqlBulkCopy将.net DataTable对象插入/更新到包含SQL_变量列的SQL Server表。然而,SqlBulkCopy坚持将放入该列的日期时间值存储为sql类型“DateTime”,而我需要的是“datetime2” 我的数据表定义如下: DataTable dataTable = new DataTable(); dataTable.Columns.Add(new DataColumn("VariantValue", typeof(object))); //th

我正在使用SqlBulkCopy将.net DataTable对象插入/更新到包含SQL_变量列的SQL Server表。然而,SqlBulkCopy坚持将放入该列的日期时间值存储为sql类型“DateTime”,而我需要的是“datetime2”

我的数据表定义如下:

DataTable dataTable = new DataTable();
dataTable.Columns.Add(new DataColumn("VariantValue", typeof(object))); //this represents my sql_variant column
SELECT SQL_VARIANT_PROPERTY(VariantValue,'BaseType') AS basetype FROM test
然后我把一些需要“datetime2”来存储的数据扔进去

DataRow row = dataTable.NewRow();
row[0] = DateTime.MinValue;
dataTable.Rows.Add(row);
然后我使用SqlBulkCopy将数据输入Sql Server:

using (SqlBulkCopy bulk = new SqlBulkCopy(myConnection))
{
     bulk.DestinationTableName = "tblDestination";     
     bulk.WriteToServer(dataTable);     
}
如果数据表中的DateTime值超出sql“DateTime”类型的范围(例如“1/1/0001”),则我的批量复制将失败。这就是为什么列需要为“datetime2”类型的原因

当您编写插入sql_变量列的常规insert语句时,您可以使用CAST或CONVERT控制变量列的类型。例如:

insert into [tblDestination] (VariantValue) values (CAST('1/1/0001' AS datetime2))
然后,如果要按如下方式显示变量列的实际类型:

DataTable dataTable = new DataTable();
dataTable.Columns.Add(new DataColumn("VariantValue", typeof(object))); //this represents my sql_variant column
SELECT SQL_VARIANT_PROPERTY(VariantValue,'BaseType') AS basetype FROM test
您将看到它确实被存储为“datetime2”


但我使用的是SqlBulkCopy,据我所知,没有地方告诉它.net DateTime对象应该存储在“datetime2”而不是“DateTime”类型的列中。据我所知,DataTable对象上也没有地方声明这一点。有谁能帮我弄清楚如何做到这一点吗?

根据MSDN页面(在“备注”下):

批量加载类型为的DataTable列时,SqlBulkCopy将失败 SqlDateTime转换为SQL Server列,该列的类型为 SQL Server 2008中添加的日期/时间类型

因此,
SqlBulkCopy
将无法处理
DateTime2
值。相反,我建议从两个选项中选择一个:

  • 分别插入每一行(即在数据表上使用
    foreach
    ),在其中处理数据类型。(使用存储的proc包装insert并利用
    SqlCommand.Parameters
    键入insert的数据可能会有所帮助。)
  • 大容量插入字符串临时表,然后将数据传输到SQL中的主表(根据需要转换数据类型)。(我认为这会变得不必要的复杂,但您可以为大型数据集寻找一些性能)

  • 那真臭。我希望他们能抽出时间来更新我的副本。谢谢你提供的信息。是的,我总是发现SQL Server的大容量插入功能不足。如果您的输入数据来自文件,您也可以尝试查看一些SSIS选项。