Sql-Server

如何刪除多個表的標識規範

  • August 1, 2018

我的數據庫中有 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

現在我想刪除 IDENTITY,不僅是為了這個,而且是為了所有剩餘的表。

沒有用於從 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');

元數據傳輸和重命名

-- 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;

引用自:https://dba.stackexchange.com/questions/87420