我有一个CSV文件,其中包含大约400万行干净数据,我需要将其导入SQL Server 2008 R2数据库。
我试图通过TSQL,SSIS和其他一些方法来做到这一点,但最后我总是遇到同样的问题,每行有2000多列。 SQL Server在读取CSV文件中的许多列时遇到问题。
所以,我最后编写了一个小的C#控制台程序来解析csv文件并完成所有工作,将2,000多列分成数据库中的关系表。一切都很好,但CSV文件有400万行,效率是关键。
所有这一切都说,这就是我遇到的问题,而不能为我的生活弄明白。我使用旧的SqlCommand类进行批量插入。我无法弄清楚如何在db中获取null值。例如,走这条线
var PreparedCommand = "insert into person_modeling_info (person_id, modeling_info, response) values ";
PreparedCommand += "( " + info[0] + ",'" + info[1] + "'," + (item2.Value == "" ? "'NULL'" : "'"+item2.Value+"'") + "),";
我并不担心SQL注入,因为我100%确定数据是干净的。我知道我可以使用参数插入null,但参数较慢,因为我必须一次插入一条记录而不是像批量插入一样
insert into table (values), (values), (values)
当我使用连接执行插入时,它将作为空字符串插入到数据库中。
如果任何人有想法,我们将非常感谢任何帮助。
答案 0 :(得分:3)
您确定item2.Value
尚未== null吗?你试过了吗?
PreparedCommand += "( " + info[0] + ",'" + info[1] + "'," + (item2.Value == null ? "'NULL'" : "'"+item2.Value+"'") + "),";
答案 1 :(得分:1)
你应该这样试试:
您必须从'NULL'
删除单引号,同时添加item2.Value
的检查为空或空。
var PreparedCommand = "insert into person_modeling_info (person_id, modeling_info, response) values ";
PreparedCommand += "( " + info[0] + ",'" + info[1] + "'," + ( string.IsNullOrEmpty(item2.Value)==true? "NULL" : "'"+item2.Value+"'") + "),";
答案 2 :(得分:1)
您可以使用相同的想法使插入列具有条件:
var PreparedCommand = "insert into person_modeling_info (person_id, modeling_info" + (item2.Value == "" ? "" : ",response") + ") values ";
PreparedCommand += "( " + info[0] + ",'" + info[1] + "'" + (item2.Value == "" ? "" : ",'"+item2.Value+"'") + "),";
最好,您需要使用SQL参数并使用DbNull.Value
答案 3 :(得分:0)
使用SqlParameters
并指定DbNull.Value
。真的,没有任何借口。在这样的公共论坛上发布SQL注入代码是一种冒犯。一些无辜的白痴会在2年后复制/粘贴它......
当然,从CSV移动有效 4M行实际上是关于bcp.exe,SSIS或最差SqlBulkCopy
的问题。我建议您阅读The Data Loading Performance Guide并了解Operations That Can Be Minimally Logged。