2

(请原谅我 - 我对 StackOverflow 和 SQL 都是新手) Tl;dr - 使用@@identity(或任何其他选项,如 scope_identity 或输出变量)时,是否也可以使用视图?下面是一个使用存储过程的示例@@identity

--SNIP--
DECLARE @AID INT
DECLARE @BID INT


INSERT INTO dbo.A (oct1)
VALUES
(@oct1)

SELECT @AID = @@IDENTITY;

INSERT INTO dbo.B (duo1)
VALUES
(@duo2)

SELECT @BID = @@IDENTITY

INSERT INTO dbo.tblAB (AID, BID)
VALUES
(@AID, @BID)
GO

更长:

插入表时,您可以使用 捕获标识种子的当前值@@identity。如果您想插入表 A 和 B,捕获标识值,然后插入与 A 和 B 相关的表 AB,这很有用。显然,这是出于数据规范化的目的。

假设您要使用一些对表执行内部连接以使数据更易于使用的数据库模式进行抽象。在这种情况下,您将如何正确填充交叉引用表?是否可以以相同的方式完成,如果可以,如何?

4

2 回答 2

5

如果您的系统正在使用并行计划,请避免使用 @@IDENTITY 或 SCOPE_IDENTITY(),因为存在严重的错误。请参考 - http://connect.microsoft.com/SQL/feedback/ViewFeedback.aspx?FeedbackID=328811

获取插入的身份 ID 的更好方法是使用 OUTPUT 子句。

CREATE TABLE tblTest
(         
    Sno         INT IDENTITY(1,1) NOT NULL,         
    FirstName   VARCHAR(20) 
)  

DECLARE @pk TABLE (ID INT)  

INSERT INTO tblTest(FirstName) 
OUTPUT INSERTED.Sno INTO @pk
SELECT 'sample' 

SELECT * FROM @pk 

编辑:

它也适用于视图。请参阅下面的示例。希望这就是你要找的。

CREATE VIEW v1
AS
SELECT sno, firstname FROM tbltest
GO

DECLARE @pk TABLE (ID INT)  

INSERT INTO v1(FirstName) 
OUTPUT INSERTED.Sno INTO @pk
SELECT 'sample' 

SELECT ID FROM @pk
于 2012-07-18T05:56:07.817 回答
2

@@IDENTITY 返回在连接上生成的最后一个 IDENTITY 值,与生成该值的表无关,也与生成该值的语句的范围无关。

SCOPE_IDENTITY() 返回连接上和同一范围内的语句生成的最后一个 IDENTITY 值,而不管生成该值的表是什么。SCOPE_IDENTITY() 和@@IDENTITY 一样,将返回当前会话中创建的最后一个身份值,但它也会将其限制在您当前的范围内

虽然其中任何一个问题都已由 microsoft 解决,但我建议您应该使用“OUTPUT”,是的,它也可以与视图一起使用

于 2012-07-18T07:58:39.390 回答