2010-08-19 4 views
41

Ho bisogno di farlo solo per i test, ma poi lo annulla quando il test è terminato.Come ri-seminare un'identità tabella in SQL Server 2008 e annullare tutto in modo sicuro?

Ho visto alcuni tutorial online su come ri-seminare un tavolo, ma non tanto su come annullarlo.

Diciamo che la definizione della tabella è il seguente:

create table beer 
(
beer_id numeric(10) not null, 
mnemonic  nvarchar(8) 
); 
go 

Diciamo che voglio le nuove identità per iniziare temporaneamente 12345, e alla fine eliminare le nuove righe e impostare l'identità accanto a quello che si sarebbe stato.

risposta

99

Il comando per reimpostare la proprietà identità è

DBCC CHECKIDENT (tablename, RESEED, new_reseed_value) 

Quando si desidera impostare l'identità della colonna a 12345 si esegue questo

DBCC CHECKIDENT (beer, RESEED, 12345) 

Quando si desidera eliminare le righe di test e ripristinare il valore al valore precedente, fai quanto segue.

DELETE 
FROM beer 
WHERE beer_id >= 12345 ; 

DECLARE @NewSeed NUMERIC(10) 
SELECT @NewSeed = MAX(beer_id) 
FROM beer ; 

DBCC CHECKIDENT (beer, RESEED, @NewSeed) 

Ecco una dimostrazione per il tuo scenario. Si noti che la colonna beer_id viene creato con la proprietà IDENTITY (1, 1), che i semi della identità a 1 con un incremento di 1.

CREATE TABLE beer 
    (  
    beer_id NUMERIC(10) IDENTITY (1,1) NOT NULL, 
    mnemonic NVARCHAR(8) 
    ); 

GO 

INSERT INTO beer(mnemonic) VALUES ('Beer 1') 
INSERT INTO beer(mnemonic) VALUES ('Beer 2') 

SELECT * 
FROM beer ; 

DBCC CHECKIDENT (beer, RESEED, 12345) 
GO 

INSERT INTO beer(mnemonic) VALUES ('Beer 3') 
INSERT INTO beer(mnemonic) VALUES ('Beer 4') 

SELECT * 
FROM beer ; 

DELETE 
FROM beer 
WHERE beer_id >= 12345 ; 

DECLARE @NewSeed NUMERIC(10) 
SELECT @NewSeed = MAX(beer_id) 
FROM beer ; 

DBCC CHECKIDENT (beer, RESEED, @NewSeed) 
GO 

INSERT INTO beer(mnemonic) VALUES ('Beer 5') 
INSERT INTO beer(mnemonic) VALUES ('Beer 6') 

SELECT * 
FROM beer ; 
+0

+1 Grazie, si presenta come una risposta completa. Darò una prova. –

+5

Proprio come una FYI, se hai bisogno di sapere qual è il seme corrente puoi eseguire questo 'SELECT IDENT_CURRENT ('table_name')' – JMS10

Problemi correlati