Din*_*lla 4 sql-server-2008 sql-server identity
我的数据库中有 109 个表。现在我正在使用身份插入迁移到 Amazon 服务器,并且我想删除所有表的自动增量列规范。如何在 SQL Server 2008 中为所有表设置自动增量列,即标识规范为“否”?
例如,我有
CREATE TABLE dbo.tbl_acc
(
a1 NUMERIC (18) IDENTITY NOT NULL,
a2 NUMERIC (18) NULL,
a3 VARCHAR (4000) NULL,
a4 VARCHAR (3999) NULL,
CONSTRAINT PK_tbl_acc PRIMARY KEY (a1)
)
GO
Run Code Online (Sandbox Code Playgroud)
现在我想删除 IDENTITY,不仅是为了这个,而且是为了所有剩余的表。
Pau*_*ite 11
没有用于从 SQL Server 中的列中删除标识属性的内置命令。您可能需要创建一个新表,复制所有数据,然后重命名该表。这可能既费时又笨拙,尤其是当您有外键约束、模式绑定函数、索引视图等内容时。
也就是说,至少有一种方法可以避免复制数据,但这同样不适用于所有情况,特别是如果您有外键。示例如下:
示例表和数据
CREATE TABLE dbo.tbl_acc
(
a1 NUMERIC (18) IDENTITY NOT NULL,
a2 NUMERIC (18) NULL,
a3 VARCHAR (4000) NULL,
a4 VARCHAR (3999) NULL,
CONSTRAINT PK_tbl_acc PRIMARY KEY (a1)
)
GO
INSERT dbo.tbl_acc
(a2, a3, a4)
VALUES
(1, 'a', 'b'),
(2, 'c', 'd');
Run Code Online (Sandbox Code Playgroud)
元数据传输和重命名
-- Copy of the source table specification,
-- but without the IDENTITY property
-- Note the PRIMARY KEY constraint name
-- also has to be different
CREATE TABLE dbo.tbl_acc2
(
a1 NUMERIC (18) NOT NULL,
a2 NUMERIC (18) NULL,
a3 VARCHAR (4000) NULL,
a4 VARCHAR (3999) NULL,
CONSTRAINT PK_tbl_acc2 PRIMARY KEY (a1)
)
GO
BEGIN TRANSACTION
-- Transfer the data as a metadata operation
-- TODO: Add error handling
ALTER TABLE dbo.tbl_acc
SWITCH TO dbo.tbl_acc2;
-- Drop the source table (now empty)
DROP TABLE dbo.tbl_acc;
-- Rename the table
EXECUTE sys.sp_rename
@objname = N'dbo.tbl_acc2',
@newname = N'tbl_acc',
@objtype = 'OBJECT';
-- Rename the primary key
EXECUTE sys.sp_rename
@objname = N'dbo.tbl_acc.PK_tbl_acc2',
@newname = N'PK_tbl_acc',
@objtype = 'INDEX';
COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)