插入SQL Server视图时使用@@ identity或输出?

sta*_*r84 2 sql-server identity view seed

(原谅我 - 我是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
Run Code Online (Sandbox Code Playgroud)

更长:

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

假设您要使用一些在表上执行内部联接的数据库抽象数据库模式,以使数据更易于使用.在这种情况下,您将如何正确填充交叉引用表?可以这样做,如果是这样,怎么样?

vmv*_*vel 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 
Run Code Online (Sandbox Code Playgroud)

编辑:

它也适用于Views.请参阅下面的示例.希望这是你想要的.

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
Run Code Online (Sandbox Code Playgroud)