【发布时间】:2012-07-18 04:54:57
【问题描述】:
(原谅我 - 我是 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,这很有用。显然这是为了数据规范化。
假设您要使用一些对表执行内部联接的数据库架构进行抽象,以使数据更易于使用。在这种情况下,您将如何正确填充交叉引用表?是否可以以同样的方式完成,如果可以,如何?
【问题讨论】:
-
最好避免使用@@identiy 或Scope_identity()。有一个与之相关的讨厌的错误 - vadivel.blogspot.in/2012/02/…
-
您还有哪些其他选择?我已经编辑了问题以包含其他选项的选项:)
-
使用 INSERT 的 OUTPUT 子句获取您要查找的值。示例可以在这里找到 - support.microsoft.com/kb/2019779
-
@vmvadivel - 说完全避免使用它们似乎有些危言耸听。该问题仅出现在并行计划中,我无法想象 OP 中的查询将获得并行计划。
-
@MartinSmith 是的,我同意。在我之前的评论中提供的链接中,我提到“如果您的系统使用并行计划,请避免使用 SCOPE_IDENTITY() 和 @@IDENTITY 函数。”。但是在发布答案时忘记提及它。现在改了。
标签: sql-server view identity seed