如何使批量插入使用多个表

时间:2011-10-17 20:52:14

标签: sql sql-server-2008

如果存在外键关系,我可以如何插入SQL服务器批量插入?

我的意思是表格就是这个,

CREATE TABLE [dbo].[UndergroundFacilityShape]
([FacilityID] [int] IDENTITY(1,1) NOT NULL,
[FacilityTypeID] [int] NOT NULL,
[FacilitySpatialData] [geometry] NOT NULL)

CREATE TABLE [dbo].[UndergroundFacilityDetail]
([FacilityDetailID] [int] IDENTITY(1,1) NOT NULL,
[FacilityID] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Value] [nvarchar](255) NOT NULL)

因此每个UndergroundFacilityShape都可以有多个UndergroundFacilityDetail。问题是在插入完成之前未定义FacilityID,因为它是标识列。如果我将数据批量插入到Shape表中,那么我就无法将它与我在C#应用程序中的详细数据进行匹配。

我猜测解决方案是运行一个SQL语句来找出下一个标识值是什么,并自己填充值并关闭批量插入的标识列?请记住,只有一个人将运行此应用程序来插入数据,并且不经常这样做,所以我们不必担心身份值冲突或类似的事情。

我正在尝试导入数千条记录,使用标准插入大约需要3分钟,但批量插入只需几秒钟。

将来我希望导入比“数千”记录大得多的数据。

2 个答案:

答案 0 :(得分:1)

事实证明这很简单。获取每个表上的当前标识值,并在我使用它们时将它们填充到DataTable中。我还必须确保使用正确的值来维持关系。而已。我是否关闭了标识列似乎并不重要。

我一直在实时数据上使用这个工具已经有一段时间了,它运行正常。

虽然导入时间不会超过3秒(而不是3分钟),但非常值得,而且我希望在某些时候可以获得更大的数据集。

那么如果不止一个人同时使用该工具呢?好吧,我希望问题,但对我们来说情况永远不会如此。

答案 1 :(得分:0)

彼得,你提到你已经有一个直接INSERT的解决方案。

如果目标表没有聚簇索引(或者具有聚簇索引并且为空),则只需使用TABLOCK查询提示将使其成为最小化记录的事务,从而显着提高速度。

如果目标表具有聚簇索引且不为空,则除了TABLOCK查询提示之外,还可以启用跟踪标志610,以使其成为记录最少的事务。

检查INSERT MSDN page上的“使用INSERT INTO…SELECT批量导入数据并使用最小日志记录”部分。