如果存在外键关系,我可以如何插入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分钟,但批量插入只需几秒钟。
将来我希望导入比“数千”记录大得多的数据。
答案 0 :(得分:1)
事实证明这很简单。获取每个表上的当前标识值,并在我使用它们时将它们填充到DataTable中。我还必须确保使用正确的值来维持关系。而已。我是否关闭了标识列似乎并不重要。
我一直在实时数据上使用这个工具已经有一段时间了,它运行正常。
虽然导入时间不会超过3秒(而不是3分钟),但非常值得,而且我希望在某些时候可以获得更大的数据集。
那么如果不止一个人同时使用该工具呢?好吧,我希望问题,但对我们来说情况永远不会如此。
答案 1 :(得分:0)
INSERT
的解决方案。
如果目标表没有聚簇索引(或者具有聚簇索引并且为空),则只需使用TABLOCK
查询提示将使其成为最小化记录的事务,从而显着提高速度。
如果目标表具有聚簇索引且不为空,则除了TABLOCK
查询提示之外,还可以启用跟踪标志610,以使其成为记录最少的事务。
检查INSERT MSDN page上的“使用INSERT INTO…SELECT
批量导入数据并使用最小日志记录”部分。