【发布时间】:2011-11-15 04:26:22
【问题描述】:
当存在外键关系时,如何使用 SQL Server 批量插入插入多个表?
我的意思是桌子是这样的,
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 分钟,但批量插入需要几秒钟。
未来我希望导入比“数千”条记录大得多的数据。
【问题讨论】:
-
您是否考虑过使用 SSIS 代替 BULK INSERT?
-
批量插入用于正确构建的数据。如果您在插入时有未知关系(例如您的父/子外键值),则不适合批量插入。
-
我目前有一个使用直插的解决方案,因此任何解决方案都必须比这更快。这就是我的目标。否则我就让它保持原样。
-
如果您在插入前后禁用/启用身份会怎样?
-
文件结构是什么?你也可以展示你的插入解决方案,也许我们可以加快速度。
标签: sql sql-server-2008