我建议在SQL Server 2005/2008中使用XML功能,这将允许您批量插入和批量更新。我会采取以下方法:
- 将整个文件处理为内存数据结构。
- 从此结构创建单个XML文档以传递给存储过程。
- 创建一个存储过程,将XML文档中的数据加载到临时表中,然后执行插入和更新。请参阅下面有关创建存储过程的指导。
有许多优点,以这种方式:
- 整个操作在一个数据库调用完成,但如果你的数据集是真正的大,你可能要批的。
- 您可以轻松地将所有数据库写入包装到单个事务中,并在出现任何问题时回滚。
- 您没有使用任何动态SQL,这可能会带来安全风险。
- 您可以使用OUTPUT子句返回插入,更新和/或删除记录的ID。
在存储过程,你需要的方面,像下面应该工作:
CREATE PROCEDURE MyBulkUpdater
(
@p_XmlData VARCHAR(MAX)
)
AS
DECLARE @hDoc INT
EXEC sp_xml_preparedocument @hDoc OUTPUT, @p_XmlData
-- Temporary table, should contain the same schema as the table you want to update
CREATE TABLE #MyTempTable
(
-- ...
)
INSERT INTO #MyTempTable
(
[Field1],
[Field2]
)
SELECT
XMLData.Field1,
XMLData.Field2
FROM OPENXML (@hdoc, 'ROOT/MyRealTable', 1)
WITH
(
[Field1] int,
[Field2] varchar(50),
[__ORDERBY] int
) AS XMLData
EXEC sp_xml_removedocument @hDoc
现在,你可以简单地插入,更新和从你的临时表中删除你的真正的表按要求如
INSERT INTO MyRealTable (Field1, Field2)
SELECT Field1, Field2
FROM #MyTempTable
WHERE ...
UPDATE MyRealTable
SET rt.Field2 = tt.Field2
FROM MyRealTable rt
JOIN MyTempTable tt ON tt.Field1 = MyRealTable.Field1
WHERE ...
对于需要传递的XML的一个例子,你可以这样做:
SELECT TOP 1 *, 0 AS __ORDERBY FROM MyRealTable AS MyRealTable FOR XML AUTO, ROOT('ROOT')
欲了解更多信息,请参见OPENXML,sp_xml_preparedocument和sp_xml_removedocument。
你使用哪种数据库?大多数常见的DBMS产品都有自己的用于处理导入数据的实用程序。 – APC 2010-10-11 06:46:12
线程只会在CPU限制问题时起作用。只是说... – Arafangion 2010-10-11 06:49:05
那么有些东西还不清楚:它是“一次性导入吗?是通过asp.net上传的文件吗? – 2010-10-11 06:49:07