20

我想将列的 Is Identity 属性设置为关闭,然后在插入一个显式值后再次将其设置为打开。我写了这个查询:

SET IDENTITY_INSERT Tbl_Cartoons OFF

尽管它成功执行,但表格设计没有任何变化。请提出一个解决方案,这真的很关键。

4

6 回答 6

40

您实际上想SET IDENTITY_INSERT Tbl_Cartoons ON在尝试插入显式值之前使用。

您是说“将负责将值插入IDENTITY列”。

SET IDENTITY_INSERT Tbl_Cartoons OFF说“我会让系统负责将值插入IDENTITY列”。

于 2013-02-25T11:00:19.957 回答
25

要将显式值插入标识列,请执行以下操作:

SET IDENTITY_INSERT Tbl_Cartoons  ON
GO

-- code to insert explicit ID values

SET IDENTITY_INSERT Tbl_Cartoons  OFF
GO
于 2013-02-25T11:13:34.450 回答
10

您给出的所有行都是禁用标识,以便您可以将特定值插入您的标识列 - 通常这是一次性的,例如移动数据。身份仍然存在于列上,只是没有被执行。从概念上讲,这类似于禁用和删除触发器之间的区别。

从列中完全删除标识更难。问题涵盖了它,但基本思想是您必须创建一个新列,复制数据,然后删除标识列。

于 2013-02-25T10:54:33.877 回答
7

SET IDENTITY_INSERT允许设置的会话输入显式值。

但该列仍然是一个标识列。只是您的会话可以忽略身份约束。

于 2013-02-25T10:54:44.267 回答
1

设置 identity_insert 以能够显式设置 id 列的值。再次将其设置为自动分配。

于 2013-02-25T10:55:21.580 回答
0

可以关闭 Identity 属性,但它涉及编辑系统表,这不是一个好的做法。您也不太可能拥有必要的权限,并且可能会看到You do not have permission to run the RECONFIGURE statement尝试以下代码:

DECLARE @tableName nvarchar(128) = 'YourTable';

-- Get a list of identity columns (informational)
SELECT OBJECT_NAME(object_id) tableName, sc.name colName, st.name dataType
FROM sys.columns sc
JOIN sys.types st
    ON st.system_type_id = sc.system_type_id
WHERE sc.is_identity = 1
AND OBJECT_NAME(object_id) = @tableName

-- Allow ad-hoc changes to system catalogs
EXEC  sp_configure 'allow update', 1
GO
reconfigure with override
GO
-- Eliminate the identityness
UPDATE syscolumns SET colstat = colstat - 1
WHERE id = object_id(@tableName)
AND name = 'Id' -- Specify column if you like, though only one identity per table is currently supported
GO
-- Unallow ad-hoc changes to system catalogs
exec sp_configure 'allow update', 0
GO
reconfigure with override
GO
于 2016-03-13T04:00:08.257 回答