我开始使用 uniqueidentifiers,但遇到了一个意想不到的问题。
首先,在我通常使用 SCOPE_IDENTITY() 的地方,使用 uniqueidentifier 不再可能,尽管在概念上它仍然涉及作为默认值(newid() 或 newsequentialid() 的结果)自动生成的 id 值) 约束。
我决定在 INSERT 语句中使用 OUTPUT 子句将 UUID 输出到表变量。现在我想起来了,OUTPUT 子句使 SCOPE_IDENTITY 过时,考虑到它是实现相同以及更多功能的更清晰和更强大的方法(例如,为所有插入的行获得对多个自动生成的列的清晰和直接访问)。
但是,使用 OUTPUT 后,我现在想知道这会如何影响通常在插入之后的 @@rowcount 测试。@@rowcount 会反映主语句中插入的行数还是输出子句插入表变量中的行数?
您可能认为它不会产生影响(即计数应该是相同的任何一种方式),但它确实会产生影响,因为文档说即使插入语句失败,OUTPUT 子句也会返回值并填充表.
具有 OUTPUT 子句的 UPDATE、INSERT 或 DELETE 语句将向客户端返回行,即使该语句遇到错误并被回滚。如果在运行语句时发生任何错误,则不应使用结果。
它确实提到 @@rowcount 特别是在使用 OUTPUT 时总是反映最外层的语句,但它提到这是嵌套查询的上下文。由于在我的例子中 OUTPUT 子句是最外层语句的一部分,因此如果插入语句失败,@@rowcount 是否会报告插入到输出表中的行数尚不清楚。
declare @new_uuid TABLE (ID uniqueidentifier);
insert into Users (ID, PersonID, Username, Password, Notes, Enabled)
output INSERTED.UUID into @new_uuid
values (@id, @personid, @username, @password, @notes, @enabled )
if (@@rowcount <> 1) goto fail; --does this reflect rows inserted into Users or @new_uuid? What if the insert fails, and rows are still output to @new_uuid?