【问题标题】:large insert in two tables. First table will feed second table with its generated Id两个表中的大插入。第一个表将为其生成的 Id 提供第二个表
【发布时间】:2011-03-09 05:58:27
【问题描述】:

关于如何对以下查询进行 t-sql 编程的一个问题:

表 1 我在一个有两列的表中插入了 400.000 个手机号码。要插入的号码和身份 ID。

表 2 第二个表称为 SendList。它是一个包含 3 列、一个身份 ID、一个列表 ID 和一个电话号码 ID 的列表。

表 3 称为 ListInfo 并包含 PK 列表 ID。以及有关列表的信息。

我的问题是我应该如何使用 T-sql:

将带有phonenumbers的大列表插入到表1中,从phonenum的插入中插入生成的id。在表 1 中,到表 2。以优化的方式与。不能花很长时间,这是我的问题。

如果有人能在这方面指导我,我们将不胜感激。

谢谢

塞巴斯蒂安

【问题讨论】:

  • 您是从文件中加载这些值吗?如果是这样,您使用什么来导入文件?
  • 另外,您确定需要表 1 中的标识列吗?如果电话号码是唯一的,则该列可能是更合适的键。否则,标识列可能会给您一种独特的错误感觉。
  • 不同意@jmgant,电话号码从来都不是唯一的。多个人可以拥有相同的电话号码,并且当人们关闭它们时它们会被重复使用。永远不要依赖电话号码是唯一的。
  • @HLGEM,你是对的,因此第二句中的“如果”。如果不能保证它们是唯一的,那么表中可能应该不止这两列,这样您就可以拥有某种真正的关系完整性。
  • 使用业务数据作为主键是淫秽的。甚至考虑过这样做的人都不应该再靠近计算机。

标签: sql tsql database-design optimization


【解决方案1】:

您使用的是什么版本的 SQL Server?如果您使用的是 2008,则可以使用 OUTPUT 子句插入多条记录并将所有标识记录输出到表变量。然后你可以使用它来插入到子表中。

DECLARE @MyTableVar table(MyID int);
INSERT MyTabLe (field1, field2)    
OUTPUT INSERTED.MyID
        INTO @MyTableVar
select Field1, Field2 from MyOtherTable where field3 = 'test'

--显示表变量的结果集。

Insert MyChildTable (myID,field1, field2)
Select MyID, test, getdate() from @MyTableVar

我没有尝试直接使用批量插入,但您始终可以将批量插入到临时表,然后使用上述过程。插入一组记录比一次插入一个记录组快得多。

【讨论】:

  • 感谢您的意见!用户将文件(xls、xlsx 或 txt)上传到网络服务器。我使用 3rdparty 类加载到 DataTable (ADO.NET)。 (适用于小文件,不适用于大文件)。如果它的列表很大,那么我会将文件 ftp 到托管 sql server 2008 的服务器的 C:\。然后我批量插入 txt 文件。对于 xls 和 xlsx,我正在考虑使用 SSIS 加载它们(以及将它们从 SSIS 直接从 web 服务器加载到 Sql Server,但防火墙问题仍然给我带来问题)。 @HLGEM OUTPUT INSERTED.xx 似乎是正确的解决方案。我会试试的=)
  • 这里是数据模型初稿的链接。它最终会随着更多的表而增长。 dl.dropbox.com/u/2557994/datamodel.png
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
相关资源
最近更新 更多