使用单个语句切换插入标识

Toggle insert identity with single statement

对于现场真正懒惰的人:是否有 单个 语句可以将 IDENTITY INSERT sometable 从打开切换到关闭,反之亦然?

不,没有 'toggel identity_insert' 声明并且有充分的理由:

数据库自动生成的值不具有任何业务意义。

使用标识列作为代理键,可以帮助您简化数据库中的事情,但是将业务意义归因于数据库为您生成的值是错误的 - 是什么导致人们提出诸如 "How to fix the gaps in my identity column" (my personal favorite answer is this one 作者 Aaron Bertrand)。

事实上,当您只使用自动生成的值时,它们是非常有用的工具,因为它们是为使用而设计的 - 标识列旨在提供一个简单的行标识符,它在递增(或递减)行插入 table 的顺序。

出于这个原因,set identity_insert 应该只在极少数情况下使用 - 事实上,除了将数据从一个 table 复制到另一个,当你想保持原始值时 -我什至想不出 set identity_insert 有用的另一种情况。

结合每个会话只能有一个 table 处于 identity_insert 状态这一事实,您应该能够轻松理解为什么您不想看到类似 [=12] 的内容=] 这充其量是模棱两可的。

tl;dr; 考虑到应该使用 set identity_insert 语句的次数有限,而且它的局限性,toggle identity_insert 语句是一个真是个坏主意。