it-swarm.com.de

Hinzufügen einer Identität zu einer vorhandenen Spalte

Ich muss den Primärschlüssel einer Tabelle in eine Identitätsspalte ändern, und die Tabelle enthält bereits eine Reihe von Zeilen.

Ich habe ein Skript, das die IDs bereinigt, um sicherzustellen, dass sie ab 1 fortlaufend sind. Funktioniert in meiner Testdatenbank einwandfrei.

Wie lautet der SQL-Befehl, um die Spalte so zu ändern, dass sie eine Identitätseigenschaft aufweist?

406
Kirschstein

Sie können die vorhandenen Spalten für die Identität nicht ändern.

Sie haben 2 Möglichkeiten,

  1. Erstellen Sie eine neue Tabelle mit Identität und löschen Sie die vorhandene Tabelle

  2. Erstellen Sie eine neue Spalte mit Identität und löschen Sie die vorhandene Spalte

Vorgehensweise 1. ( Neue Tabelle ) Hier können Sie die vorhandenen Datenwerte in der neu erstellten Identitätsspalte beibehalten.

CREATE TABLE dbo.Tmp_Names
    (
      Id int NOT NULL
             IDENTITY(1, 1),
      Name varchar(50) NULL
    )
ON  [PRIMARY]
go

SET IDENTITY_INSERT dbo.Tmp_Names ON
go

IF EXISTS ( SELECT  *
            FROM    dbo.Names ) 
    INSERT  INTO dbo.Tmp_Names ( Id, Name )
            SELECT  Id,
                    Name
            FROM    dbo.Names TABLOCKX
go

SET IDENTITY_INSERT dbo.Tmp_Names OFF
go

DROP TABLE dbo.Names
go

Exec sp_rename 'Tmp_Names', 'Names'

Ansatz 2 ( Neue Spalte ) Sie können die vorhandenen Datenwerte in der neu erstellten Identitätsspalte nicht beibehalten. Die Identitätsspalte enthält die Zahlenfolge.

Alter Table Names
Add Id_new Int Identity(1, 1)
Go

Alter Table Names Drop Column ID
Go

Exec sp_rename 'Names.Id_new', 'ID', 'Column'

Weitere Informationen finden Sie im folgenden Microsoft SQL Server-Forumsbeitrag:

So ändern Sie die Spalte in Identität (1,1)

442
John Sansom

In SQL 2005 und höher gibt es einen Trick, um dieses Problem zu lösen, ohne die Datenseiten der Tabelle zu ändern. Dies ist wichtig für große Tabellen, bei denen das Berühren jeder Datenseite Minuten oder Stunden dauern kann. Der Trick funktioniert auch, wenn die Identitätsspalte ein Primärschlüssel ist, Teil eines gruppierten oder nicht gruppierten Index ist oder andere Fallstricke auftreten, die die einfachere Lösung zum Hinzufügen/Entfernen/Umbenennen von Spalten auslösen können.

Hier ist der Trick: Sie können die SQL Server-Anweisung ALTER TABLE ... SWITCH verwenden, um das Schema einer Tabelle zu ändern, ohne die Daten zu ändern. Dies bedeutet, dass Sie eine Tabelle durch eine IDENTITY durch ein identisches Tabellenschema ersetzen können. aber ohne eine IDENTITY-Spalte. Mit demselben Trick können Sie einer vorhandenen Spalte IDENTITY hinzufügen.

Normalerweise wird ALTER TABLE ... SWITCH verwendet, um eine vollständige Partition in einer partitionierten Tabelle effizient durch eine neue leere Partition zu ersetzen. Es kann aber auch in nicht partitionierten Tabellen verwendet werden.

Mit diesem Trick habe ich in weniger als 5 Sekunden eine Spalte einer 2,5-Milliarden-Zeilentabelle von IDENTITY in eine Nicht-IDENTITY konvertiert (um eine mehrstündige Abfrage auszuführen, deren Abfrageplan für Nicht-IDENTITY besser funktioniert hat) Spalten) und stellte dann die IDENTITY-Einstellung in weniger als 5 Sekunden wieder her.

Hier ist ein Codebeispiel, wie es funktioniert.

 CREATE TABLE Test
 (
   id int identity(1,1),
   somecolumn varchar(10)
 );

 INSERT INTO Test VALUES ('Hello');
 INSERT INTO Test VALUES ('World');

 -- copy the table. use same schema, but no identity
 CREATE TABLE Test2
 (
   id int NOT NULL,
   somecolumn varchar(10)
 );

 ALTER TABLE Test SWITCH TO Test2;

 -- drop the original (now empty) table
 DROP TABLE Test;

 -- rename new table to old table's name
 EXEC sp_rename 'Test2','Test';

 -- update the identity seed
 DBCC CHECKIDENT('Test');

 -- see same records
 SELECT * FROM Test; 

Dies ist offensichtlich komplizierter als die Lösungen in anderen Antworten, aber wenn Ihr Tisch groß ist, kann dies ein echter Lebensretter sein. Es gibt einige Einschränkungen:

  • Soweit ich weiß, können Sie mit dieser Methode nur die Identität der Tabellenspalten ändern. Das Hinzufügen/Entfernen von Spalten, das Ändern der Nullfähigkeit usw. ist nicht zulässig.
  • Sie müssen veraltete Schlüssel löschen, bevor Sie den Wechsel durchführen und sie anschließend wiederherstellen.
  • Gleiches gilt für WITH SCHEMABINDING-Funktionen, Ansichten usw.
  • die Indizes der neuen Tabelle müssen genau übereinstimmen (gleiche Spalten, gleiche Reihenfolge usw.)
  • Alte und neue Tabellen müssen sich in derselben Dateigruppe befinden.
  • Funktioniert nur unter SQL Server 2005 oder höher
  • Ich war zuvor der Meinung, dass dieser Trick nur für die Enterprise- oder Developer-Edition von SQL Server funktioniert (da Partitionen nur in Enterprise- und Developer-Versionen unterstützt werden), aber Mason G. Zhwiti in seinem Kommentar unten sagt, dass er auch in der SQL Standard Edition funktioniert. Ich gehe davon aus, dass dies bedeutet, dass die Beschränkung auf Enterprise oder Developer nicht für ALTER TABLE ... SWITCH gilt.

Es gibt einen guten Artikel auf TechNet der die obigen Anforderungen genau beschreibt.

UPDATE - Eric W hatte unten einen Kommentar, der wichtige Informationen zu dieser Lösung hinzufügt. Kopieren Sie es hierher, um sicherzustellen, dass es mehr Aufmerksamkeit erhält:

Es gibt noch eine weitere Einschränkung, die es wert ist, erwähnt zu werden. Obwohl die neue Tabelle problemlos Daten aus der alten Tabelle empfängt und alle neuen Zeilen nach einem Identitätsmuster eingefügt werden, beginnen sie bei 1 und brechen möglicherweise ab, wenn die Spalte ein Primärschlüssel ist. Erwägen Sie, DBCC CHECKIDENT('<newTableName>') unmittelbar nach dem Umschalten auszuführen. Weitere Informationen finden Sie unter msdn.Microsoft.com/en-us/library/ms176057.aspx .

Wenn die Tabelle aktiv mit neuen Zeilen erweitert wird (was bedeutet, dass zwischen dem Hinzufügen von IDENTITY und dem Hinzufügen neuer Zeilen nicht viel Ausfallzeit besteht), sollten Sie anstelle von DBCC CHECKIDENT den Identitätsstartwert in manuell festlegen neues Tabellenschema, das größer ist als die größte vorhandene ID in der Tabelle, z. B. IDENTITY (2435457, 1). Möglicherweise können Sie sowohl den ALTER TABLE...SWITCH als auch den DBCC CHECKIDENT in eine Transaktion einschließen (oder nicht-- habe dies noch nicht getestet), aber es scheint, als würde es einfacher und sicherer sein, den Startwert manuell einzustellen.

Wenn der Tabelle keine neuen Zeilen hinzugefügt werden (oder wie bei einem täglichen ETL-Prozess nur gelegentlich), wird diese Race-Bedingung offensichtlich nicht eintreten, sodass DBCC CHECKIDENT in Ordnung ist.

190
Justin Grant

Sie können eine Spalte nicht in eine IDENTITY-Spalte ändern. Sie müssen lediglich eine neue Spalte erstellen, die von Anfang an als IDENTITÄT definiert wurde, dann die alte Spalte löschen und die neue in den alten Namen umbenennen.

ALTER TABLE (yourTable) ADD NewColumn INT IDENTITY(1,1)

ALTER TABLE (yourTable) DROP COLUMN OldColumnName

EXEC sp_rename 'yourTable.NewColumn', 'OldColumnName', 'COLUMN'

Marc

64
marc_s

Es gibt eine coole Lösung, die hier beschrieben wird: SQL-SERVER - Identitätseigenschaft für Spalte hinzufügen oder entfernen

Kurz gesagt, bearbeiten Sie Ihre Tabelle manuell in SQL Manager, wechseln Sie die Identität, SPEICHERN SIE KEINE Änderungen, zeigen Sie einfach das Skript an, das für die Änderungen erstellt wird, kopieren Sie es und verwenden Sie es später.

Das spart viel Zeit, da es (das Skript) alle Fremdschlüssel, Indizes usw. enthält, die sich auf die zu ändernde Tabelle beziehen. Schreiben Sie dies manuell ... Gott bewahre.

14
greenoldman

Verwenden Sie SEQUENCE anstelle von IDENTITY .

IN SQL Server 2014 (ich weiß nicht über niedrigere Versionen) können Sie dies einfach mit Sequenz tun.

CREATE SEQUENCE  sequence_name START WITH here_higher_number_than_max_existed_value_in_column INCREMENT BY 1;

ALTER TABLE table_name ADD CONSTRAINT constraint_name DEFAULT NEXT VALUE FOR sequence_name FOR column_name

Ab hier: Reihenfolge als Standardwert für eine Spalte

6
OTAR

Einfache Erklärung

Benennen Sie die vorhandene Spalte mit sp_RENAME um

EXEC sp_RENAME 'Table_Name.Existing_ColumnName', 'New_ColumnName', 'COLUMN'

Beispiel für Umbenennung:

Die vorhandene Spalte UserID wird in OldUserID umbenannt

EXEC sp_RENAME 'AdminUsers.UserID' , 'OldUserID', 'COLUMN'

Fügen Sie anschließend mit alter query eine neue Spalte hinzu, um sie als Primärschlüssel und Identitätswert festzulegen

ALTER TABLE TableName ADD Old_ColumnName INT NOT NULL PRIMARY KEY IDENTITY(1,1)

Beispiel für Set Primary Key

Der neu erstellte Spaltenname lautet UserID

ALTER TABLE Users ADD UserID INT NOT NULL PRIMARY KEY IDENTITY(1,1)

löschen Sie dann die umbenannte Spalte

ALTER TABLE Table_Name DROP COLUMN Renamed_ColumnName

Beispiel für Umbenannte Spalte löschen

ALTER TABLE Users DROP COLUMN OldUserID

Jetzt fügen wir der vorhandenen Spalte in der Tabelle einen Primärschlüssel und eine Identität hinzu.

6

Ich bin ein Java Entwickler, der zufällig in ein Team ohne DBA eingetreten ist, und einer, bei dem ich als Entwickler keine DBA-Rechte bekomme. Ich hatte die Aufgabe, ein gesamtes Schema zwischen zwei Datenbanken zu verschieben. Ohne einen DBA musste ich es also ausführen und Skripte ausführen, da ich die GUI in SQL Server 2008 nicht verwenden konnte, weil ich keine Administratorrechte hatte.

Alles wurde problemlos verschoben. Beim Ausführen einer gespeicherten Prozedur in der neuen schema.table habe ich jedoch festgestellt, dass das Identitätsfeld in einer Tabelle verloren gegangen ist. Ich habe das Skript, mit dem die Tabelle erstellt wurde, zweimal überprüft, aber SQL Server hat es nicht abgerufen, als ich das Skript ausgeführt habe. Ein DBA teilte mir später mit, dass er das gleiche Problem schon einmal gesehen habe.

In jedem Fall sind dies für SQL Server 2008 die Schritte, die ich unternommen habe, um das Problem zu lösen, und sie haben funktioniert. Ich poste dies hier in der Hoffnung, dass es jemandem helfen wird. Das habe ich getan, da ich FK-Abhängigkeiten von einer anderen Tabelle hatte, die dies erschwerten:

Ich habe diese Abfrage verwendet, um zu überprüfen, ob die Identität tatsächlich fehlt, und um Abhängigkeiten von der Tabelle anzuzeigen.

1.) Finde Statistiken zu einer Tabelle:

exec sp_help 'dbo.table_name_old';

2.) Erstellen Sie eine doppelte, identische neue Tabelle. Fügen Sie jedoch ein Identitätsfeld in das PK-Feld ein, in dem es sich zuvor befunden hat.

3.) Deaktivieren Sie die Identität, um Daten zu verschieben.

SET IDENTITY_INSERT dbo.table_name ON 

4.) Übertragen Sie die Daten.

INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT 
field1, field2, etc...
FROM 
dbo.table_name_old;

5.) Vergewissern Sie sich, dass die Daten vorhanden sind.

SELECT * FROM dbo.table_name_new

6.) Aktivieren Sie die Identität erneut.

SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF

7.) Dies ist das beste Skript, das ich gefunden habe, um alle FK-Beziehungen abzurufen, um zu überprüfen, auf welche Tabelle (n) die Originaltabelle als Abhängigkeiten verweist, und ich bin auf viele gestoßen, daher ist es ein Keeper!

SELECT f.name AS ForeignKey,
   OBJECT_NAME(f.parent_object_id) AS TableName,
   COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
   OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
   COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
   ON f.OBJECT_ID = fc.constraint_object_id
   ORDER BY ReferenceTableName;

8.) Stellen Sie vor dem nächsten Schritt sicher, dass Sie alle PK- und FK-Skripte für alle beteiligten Tabellen haben.

9.) Sie können mit der rechten Maustaste auf jeden Schlüssel klicken und diesen mit SQL Server 2008 skripten

10.) Löschen Sie die FK (s) aus der Abhängigkeitstabelle (n) mit dieser Syntax:

ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]

11.) Löschen Sie die Originaltabelle:

DROP TABLE dbo.table_name_old;

13.) Diese nächsten Schritte basieren auf den Skripten, die Sie in SQL Server 2008 in Schritt 9 erstellt haben.

- Fügen Sie die PK zur neuen Tabelle hinzu.

--Füge den FK der neuen Tabelle hinzu.

- Fügen Sie die FKs zurück zur Abhängigkeitstabelle hinzu.

14.) Überprüfen Sie, ob alles korrekt und vollständig ist. Ich habe die GUI verwendet, um die Tabellen zu betrachten.

15.) Benennen Sie die neue Tabelle in den ursprünglichen Tabellennamen um.

exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';

Endlich hat alles geklappt!

5
James Drinkard

Wie ich im Normalfall verstanden habe, erstellen wir eine Tabelle mit Primärschlüssel, die Identitätseigenschaft hat
Also mbenennen oder Löschen ist eine Spalte, die PrimärschlüsselEinschränkung zugeordnet ist, nicht möglich weil Integritätsregeln die Spaltenstruktur validieren.
Um dies zu erreichen, müssen wir einige Schritte wie folgt ausführen:
Nehmen wir an TableName = 'Employee' und ColumnName = 'EmployeeId'

1. Fügen Sie der Tabelle 'Employee' die neue Spalte 'EmployeeId_new' hinzu
ALTER TABLE Mitarbeiter ADD EmployeeId_new INT IDENTITY (1,1)

  1. Entfernen Sie nun die Spalte 'EmployeeId' aus der 'Employee'-Tabelle
    ALTER TABLE Mitarbeiter DROP COLUMN EmployeeId

  2. Dies löst einen Fehler aus, da die Regeln für die Primärschlüsselbeschränkung anwendbar sind und die Spaltenstruktur validiert wird.
    * ### ' Nachricht 5074, Ebene 16, Status 1, Zeile 1 Das Objekt [PK_dbo.Employee] ist abhängig von Spalte [EmployeeId].' ###

  3. Also müssen wir die Primärschlüsselbedingung zuerst aus der Tabelle 'Mitarbeiter' entfernen, dann können wir die Spalte entfernen
    ALTER TABLE Employee DROP-Einschränkung [PK_dbo.Employee]

  4. Jetzt können wir die Spalte 'EmployeeId' aus der 'Employee'-Tabelle entfernen, wie im vorherigen Schritt, in dem ein Fehler aufgetreten ist
    ALTER TABLE Mitarbeiter DROP COLUMN EmployeeId

  5. Die Spalte 'EmployeeId' wurde aus der Tabelle entfernt. Daher werden wir die neu hinzugefügte neue Spalte 'EmployeeId_new' in 'EmployeeId' umbenennen.
    sp_rename 'Employee.EmployeeId', 'EmployeeId_new', 'COLUMN'

  6. Um die Tabelle in der gleichen Form wie zuvor neu anzuordnen, müssen wir die Primärschlüsseleinschränkung für die Spalte "EmployeeId" hinzufügen.
    ALTER TABLE Employee add constraint [PK_dbo.Employee] Primärschlüssel (EmployeeId)

8. Jetzt wird die Tabelle 'Employee' mit 'EmployeeId' für Identitätsregeln zusammen mit der vorhandenen Primärschlüsseleinschränkung geändert.

4
Rinku

Es gibt keine einfache Möglichkeit, das Identitätsfeature für eine vorhandene Spalte zu aktivieren oder zu deaktivieren. Die einzige Möglichkeit, dies zu tun, besteht darin, eine neue Spalte zu erstellen und diese zu einer Identitätsspalte zu machen oder eine neue Tabelle zu erstellen und Ihre Daten zu migrieren.

Wenn Sie mit SQL Server Management Studio den Identitätswert in der Spalte "id" entfernen, wird eine neue temporäre Tabelle erstellt, die Daten in die temporäre Tabelle verschoben, die alte Tabelle gelöscht und die neue Tabelle umbenannt.

Nehmen Sie die Änderung mit Management Studio vor, klicken Sie mit der rechten Maustaste in den Designer und wählen Sie "Änderungsskript generieren".

Sie werden sehen, dass SQL Server dies im Hintergrund tut.

3
Raj

sie können das nicht so machen, Sie müssen eine weitere Spalte hinzufügen, die ursprüngliche Spalte löschen und die neue Spalte umbenennen oder eine neue Tabelle erstellen, die Daten kopieren und die alte Tabelle löschen, gefolgt von der Umbenennung der neuen Tabelle in die alte Tabelle

wenn Sie SSMS verwenden und die Eigenschaft identity im Designer auf ON setzen, geschieht dies mit SQL Server im Hintergrund. Wenn Sie also eine Tabelle mit dem Namen [user] haben, geschieht dies, wenn Sie Benutzer-ID und Identität festlegen

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION

GO

GO
CREATE TABLE dbo.Tmp_User
    (
    UserID int NOT NULL IDENTITY (1, 1),
    LastName varchar(50) NOT NULL,
    FirstName varchar(50) NOT NULL,
    MiddleInitial char(1) NULL

    )  ON [PRIMARY]
GO

SET IDENTITY_INSERT dbo.Tmp_User ON
GO
IF EXISTS(SELECT * FROM dbo.[User])
 EXEC('INSERT INTO dbo.Tmp_User (UserID, LastName, FirstName, MiddleInitial)
    SELECT UserID, LastName, FirstName, MiddleInitialFROM dbo.[User] TABLOCKX')
GO
SET IDENTITY_INSERT dbo.Tmp_User OFF
GO

GO
DROP TABLE dbo.[User]
GO
EXECUTE sp_rename N'dbo.Tmp_User', N'User', 'OBJECT'
GO
ALTER TABLE dbo.[User] ADD CONSTRAINT
    PK_User PRIMARY KEY CLUSTERED 
    (
    UserID
    ) ON [PRIMARY]

GO
COMMIT

Allerdings gibt es eine Möglichkeit, die Systemtabelle zu hacken, um dies zu erreichen, indem der bitweise Wert festgelegt wird. Dies wird jedoch nicht unterstützt, und ich würde es nicht tun

3
SQLMenace

So ändern Sie die Identitätseigenschaften für eine Spalte:

  • Klicken Sie im Server-Explorer mit der rechten Maustaste auf die Tabelle mit den Identitätseigenschaften, die Sie ändern möchten, und klicken Sie auf Tabellendefinition öffnen. Die Tabelle wird im Tabellen-Designer geöffnet.
  • Deaktivieren Sie das Kontrollkästchen Nullen zulassen für die Spalte, die Sie ändern möchten.
  • Erweitern Sie auf der Registerkarte Spalteneigenschaften die Eigenschaft Identitätsspezifikation.
  • Klicken Sie auf die Rasterzelle für die untergeordnete Eigenschaft "Ist Identität" und wählen Sie in der Dropdown-Liste "Ja" aus.
  • Geben Sie einen Wert in die Zelle Identität Seed ein. Dieser Wert wird der ersten Zeile in der Tabelle zugewiesen. Der Wert 1 wird standardmäßig zugewiesen.

Das war's und es hat bei mir funktioniert

2
Ken.Fukizi

Wenn Sie Visual Studio 2017+ verwenden

  1. Klicken Sie im Serverobjekt-Explorer mit der rechten Maustaste auf Ihre Tabelle und wählen Sie "Code anzeigen".
  2. Fügen Sie der Spalte den Modifikator "IDENTITY" hinzu
  3. Aktualisieren

Dies wird alles für Sie tun.

2
jdisla

Es gibt leider keinen; Die IDENTITY-Eigenschaft gehört zur Tabelle und nicht zur Spalte.

Die einfachere Möglichkeit besteht darin, dies in der grafischen Benutzeroberfläche zu tun. Wenn dies jedoch nicht möglich ist, können Sie die Daten weitestgehend kopieren, die Spalte löschen, sie mit der Identität neu hinzufügen und die Daten zurücksetzen.

Siehe hier für ein Blow-by-Blow-Konto.

2
Jeremy Smyth

Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf den Tabellennamen. Sie erhalten einige Optionen. Klicken Sie auf "Design". Für diese Tabelle wird eine neue Registerkarte geöffnet. Sie können hier unter "Spalteneigenschaften" eine Identitätsbeschränkung hinzufügen.

2
vamsi_874

Wenn das ursprüngliche Poster tatsächlich wollte, dass eine vorhandene Spalte ein PRIMARY KEY für die Tabelle ist und die Spalte tatsächlich keine IDENTITY -Spalte sein muss (zwei verschiedene Dinge), kann dies über erfolgen t-SQL mit:

ALTER TABLE [YourTableName]
ADD CONSTRAINT [ColumnToSetAsPrimaryKey] PRIMARY KEY ([ColumnToSetAsPrimaryKey])

Beachten Sie die Klammer um den Spaltennamen nach der Option PRIMARY KEY.

Obwohl dieser Beitrag alt ist und ich eine Vermutung über den Bedarf der Anforderer anstellen möchte, waren diese zusätzlichen Informationen für Benutzer, die auf diesen Thread stoßen, hilfreich, da die Konversation meines Erachtens zu der Annahme führen könnte, dass eine vorhandene Spalte nicht als "a" festgelegt werden kann Primärschlüssel, ohne ihn zuerst als neue Spalte hinzuzufügen, was falsch wäre.

1
A. Omalley

Nach meinem derzeitigen Zustand verfolge ich diesen Ansatz. Ich möchte einer Primärtabelle eine Identität geben, nachdem Daten per Skript eingefügt wurden.

Wenn ich eine Identität anhängen möchte, beginnt diese immer von 1 bis zum Ende der gewünschten Anzahl von Datensätzen.

--first drop column and add with identity
ALTER TABLE dbo.tblProductPriceList drop column ID 
ALTER TABLE dbo.tblProductPriceList add ID INT IDENTITY(1,1)

--then add primary key to that column (exist option you can ignore)
IF  NOT EXISTS (SELECT * FROM sys.key_constraints  WHERE object_id = OBJECT_ID(N'[dbo].[PK_tblProductPriceList]') AND parent_object_id = OBJECT_ID(N'[dbo].[tblProductPriceList]'))
    ALTER TABLE [tblProductPriceList] ADD PRIMARY KEY (id)
GO

Dadurch wird dieselbe Primärschlüsselspalte mit Identität erstellt

Ich habe diese Links verwendet: https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/

Primärschlüssel zu vorhandener Tabelle hinzufügen

1
Ajay2707

Grundsätzlich gibt es vier logische Schritte.

  1. Erstellen Sie eine neue Identitätsspalte. Aktivieren Sie Identität einfügen für diese neue Spalte.

  2. Fügen Sie die Daten aus der Quellspalte (die Spalte, die Sie in Identity konvertieren möchten) in diese neue Spalte ein.

  3. Deaktivieren Sie die Insert Identity für die neue Spalte.

  4. Löschen Sie Ihre Quellspalte und benennen Sie die neue Spalte in den Namen der Quellspalte um.

Es kann einige komplexere Dinge geben, wie das Arbeiten auf mehreren Servern usw.

Bitte lesen Sie den folgenden Artikel für die Schritte (mit ssms & T-sql). Diese Schritte sind für Anfänger gedacht, die mit T-SQL weniger vertraut sind.

http://social.technet.Microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx

Ich glaube nicht, dass Sie eine vorhandene Spalte mit tsql in eine Identitätsspalte ändern können. Sie können dies jedoch über die Entwurfsansicht von Enterprise Manager tun.

Alternativ können Sie eine neue Zeile als Identitätsspalte erstellen, die alte Spalte löschen und dann Ihre neue Spalte umbenennen.

ALTER TABLE FooTable
ADD BarColumn INT IDENTITY(1, 1)
               NOT NULL
               PRIMARY KEY CLUSTERED
0

generiert ein Skript für alle Tabellen mit Primärschlüssel = bigint, für die keine Identität festgelegt wurde; Dies gibt eine Liste der generierten Skripte für jede Tabelle zurück.

SET NOCOUNT ON;

declare @sql table(s varchar(max), id int identity)

DECLARE @table_name nvarchar(max),
        @table_schema nvarchar(max);

DECLARE vendor_cursor CURSOR FOR 
SELECT
  t.name, s.name
FROM sys.schemas AS s
INNER JOIN sys.tables AS t
  ON s.[schema_id] = t.[schema_id]
WHERE EXISTS (
    SELECT
    [c].[name]
    from sys.columns [c]
    join sys.types [y] on [y].system_type_id = [c].system_type_id
    where [c].[object_id] = [t].[object_id] and [y].name = 'bigint' and [c].[column_id] = 1
) and NOT EXISTS 
(
  SELECT 1 FROM sys.identity_columns
    WHERE [object_id] = t.[object_id]
) and exists (
    select 1 from sys.indexes as [i] 
    inner join sys.index_columns as [ic]  ON  i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
    where object_name([ic].[object_id]) = [t].[name]
)
OPEN vendor_cursor

FETCH NEXT FROM vendor_cursor 
INTO @table_name, @table_schema

WHILE @@FETCH_STATUS = 0
BEGIN

DELETE FROM @sql

declare @pkname varchar(100),
    @pkcol nvarchar(100)

SELECT  top 1
        @pkname = i.name,
        @pkcol = COL_NAME(ic.OBJECT_ID,ic.column_id)
FROM    sys.indexes AS [i]
INNER JOIN sys.index_columns AS [ic] ON  i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
WHERE   i.is_primary_key = 1 and OBJECT_NAME(ic.OBJECT_ID) = @table_name

declare @q nvarchar(max) = 'SELECT  '[email protected]+' FROM ['[email protected]_schema+'].['[email protected]_name+'] ORDER BY '[email protected]+' DESC'

DECLARE @ident_seed nvarchar(max) -- Change this to the datatype that you are after
SET @q = REPLACE(@q, 'SELECT', 'SELECT TOP 1 @output = ')
EXEC sp_executeSql @q, N'@output bigint OUTPUT', @ident_seed OUTPUT

insert into  @sql(s) values ('BEGIN TRANSACTION')
insert into  @sql(s) values ('BEGIN TRY')

-- create statement
insert into  @sql(s) values ('create table ['[email protected]_schema+'].[' + @table_name + '_Temp] (')

-- column list
insert into @sql(s) 
select 
    '  ['+[c].[name]+'] ' +
    y.name + 

    (case when [y].[name] like '%varchar' then
    coalesce('('+(case when ([c].[max_length] < 0 or [c].[max_length] >= 1024) then 'max' else cast([c].max_length as varchar) end)+')','')
    else '' end)

     + ' ' +
    case when [c].name = @pkcol then 'IDENTITY(' +COALESCE(@ident_seed, '1')+',1)' else '' end + ' ' +
    ( case when c.is_nullable = 0 then 'NOT ' else '' end ) + 'NULL ' + 
    coalesce('DEFAULT ('+(
        REPLACE(
            REPLACE(
                LTrim(
                    RTrim(
                        REPLACE(
                            REPLACE(
                                REPLACE(
                                    REPLACE(
                                        LTrim(
                                            RTrim(
                                                REPLACE(
                                                    REPLACE(
                                                        object_definition([c].default_object_id)
                                                    ,' ','~')
                                                ,')',' ')
                                            )
                                        )
                                    ,' ','*')
                                ,'~',' ')
                            ,' ','~')
                        ,'(',' ')
                    )
                )
            ,' ','*')
        ,'~',' ')
    ) +
    case when object_definition([c].default_object_id) like '%get%date%' then '()' else '' end
    +
    ')','') + ','
 from sys.columns c
 JOIN sys.types y ON y.system_type_id = c.system_type_id
  where OBJECT_NAME(c.[object_id]) = @table_name and [y].name != 'sysname'
 order by [c].column_id


 update @sql set s=left(s,len(s)-1) where [email protected]@identity

-- closing bracket
insert into @sql(s) values( ')' )

insert into @sql(s) values( 'SET IDENTITY_INSERT ['[email protected]_schema+'].['[email protected]_name+'_Temp] ON')

declare @cols nvarchar(max)
SELECT @cols = STUFF(
    (
        select ',['+c.name+']'
        from sys.columns c
        JOIN sys.types y ON y.system_type_id = c.system_type_id
        where c.[object_id] = OBJECT_ID(@table_name)
        and [y].name != 'sysname'
        and [y].name != 'timestamp'
        order by [c].column_id
        FOR XML PATH ('')
     )
    , 1, 1, '')

insert into @sql(s) values( 'IF EXISTS(SELECT * FROM ['[email protected]_schema+'].['[email protected]_name+'])')
insert into @sql(s) values( 'EXEC(''INSERT INTO ['[email protected]_schema+'].['[email protected]_name+'_Temp] ('[email protected]+')')
insert into @sql(s) values( 'SELECT '[email protected]+' FROM ['[email protected]_schema+'].['[email protected]_name+']'')')

insert into @sql(s) values( 'SET IDENTITY_INSERT ['[email protected]_schema+'].['[email protected]_name+'_Temp] OFF')


insert into @sql(s) values( 'DROP TABLE ['[email protected]_schema+'].['[email protected]_name+']')

insert into @sql(s) values( 'EXECUTE sp_rename N''['[email protected]_schema+'].['[email protected]_name+'_Temp]'', N'''[email protected]_name+''', ''OBJECT''')

if ( @pkname is not null ) begin
    insert into @sql(s) values('ALTER TABLE ['[email protected]_schema+'].['[email protected]_name+'] ADD CONSTRAINT ['[email protected]+'] PRIMARY KEY CLUSTERED (')
    insert into @sql(s)
        select '  ['+COLUMN_NAME+'] ASC,' from information_schema.key_column_usage
        where constraint_name = @pkname
        GROUP BY COLUMN_NAME, ordinal_position
        order by ordinal_position

    -- remove trailing comma
    update @sql set s=left(s,len(s)-1) where [email protected]@identity
    insert into @sql(s) values ('  )')
end

insert into  @sql(s) values ('--Run your Statements')
insert into  @sql(s) values ('COMMIT TRANSACTION')
insert into  @sql(s) values ('END TRY')
insert into  @sql(s) values ('BEGIN CATCH')
insert into  @sql(s) values ('        ROLLBACK TRANSACTION')
insert into  @sql(s) values ('        DECLARE @Msg NVARCHAR(MAX)  ')
insert into  @sql(s) values ('        SELECT @Msg=ERROR_MESSAGE() ')
insert into  @sql(s) values ('        RAISERROR(''Error Occured: %s'', 20, 101,@msg) WITH LOG')
insert into  @sql(s) values ('END CATCH')

declare @fqry nvarchar(max)

-- result!
SELECT @fqry = (select char(10) + s from @sql order by id FOR XML PATH (''))


SELECT @table_name as [Table_Name], @fqry as [Generated_Query]
PRINT 'Table: '[email protected]_name
EXEC sp_executeSql @fqry

    FETCH NEXT FROM vendor_cursor 
    INTO @table_name, @table_schema
END 
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;
0
Kyle Gibbar