【问题标题】:Can one get all of the identities of a block insert of records?可以获取记录块插入的所有身份吗?
【发布时间】:2012-07-05 17:28:15
【问题描述】:

考虑以下 TSQL:

INSERT INTO Address(Street1, City, State, ZipCode)
SELECT Street1, City, StateCode, ZipCode
    FROM Contact

地址有一个自动设置的标识列。有没有办法获取新插入的地址记录的身份列表?

我知道有@@IDENTITY,但这只是返回最后一个身份。

【问题讨论】:

  • 我认为这取决于您为什么想要这些记录。您可以使用OUTPUT 子句或触发器来获取这些值

标签: sql-server-2008 tsql


【解决方案1】:

假设标识列名为AddressID,您可以:

INSERT INTO dbo.Address(Street1, ...)
OUTPUT inserted.AddressID
SELECT Street1, ...
  FROM dbo.Contact;

或者:

DECLARE @NewAddresses TABLE(AddressID INT);

INSERT INTO dbo.Address(Street1, ...)
OUTPUT inserted.AddressID INTO @NewAddresses
SELECT Street1, ...
  FROM dbo.Contact;

请记住,@@IDENTITY 应该几乎永远不会被使用。即使在处理单行插入时,SCOPE_IDENTITY() 也更安全。有关更多背景信息,请参阅this answer

【讨论】:

  • 一个问题。现在有没有办法可以将这些身份更新到现有表中?
  • 我不知道“更新...进入”是什么意思。但是是的,如果您将它们放入 @NewAddresses 表中,您可以将该表用作进一步查询(包括更新)的来源。
  • 我想要做的,似乎没有人理解的是,在一个表中为另一个表中的每条记录创建新的默认记录。在上面的示例中,我想从联系人信息中提取地址信息,并创建一个名为 Address 的联系人分支,该分支由联系人中的外键引用。我实际上并没有使用联系人和地址,但它类似于我正在做的事情,更容易理解。
  • “似乎没人理解”?这有点不公平。您提出的所有问题都是如何“获取身份列表”。如果您在获取身份列表后遇到不同的问题,请创建一个问题来询问您要提出的问题。这就像想去旧金山一样,你首先问我是否知道你的车钥匙在哪里,并期望我回复到旧金山的路线指示。
  • 不,这是另一个问题的挫败感。结果我开始断断续续地问这个问题。我想我必须这样做。
猜你喜欢
  • 2011-02-11
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 2019-06-25
  • 2019-03-20
  • 1970-01-01
相关资源
最近更新 更多