IDENTITY (proprietà) (Transact-SQL)
Crea una colonna Identity in una tabella. Questa proprietà viene utilizzata con le istruzioni CREATE TABLE e ALTER TABLE di Transact-SQL.
Nota
La proprietà IDENTITY è diversa dalla proprietà Identity di SQL-DMO che espone la proprietà di identità di riga di una colonna.
Sintassi
IDENTITY [ (seed , increment ) ]
Argomenti
seed
Valore utilizzato per la prima riga caricata nella tabella.increment
Valore incrementale aggiunto al valore Identity della riga caricata in precedenza.
È necessario specificare sia il valore di inizializzazione che l'incremento oppure nessuno dei due valori. In questo secondo caso, il valore predefinito è (1,1).
Osservazioni
Se una colonna Identity si trova in una tabella in cui vengono eseguite spesso eliminazioni, è possibile che la sequenza di valori Identity presenti interruzioni. Se ciò rappresenta un problema, non utilizzare la proprietà IDENTITY. Per assicurarsi che non siano state create interruzioni nella sequenza di valori o per inserire gli eventuali valori mancanti, è necessario valutare i valori Identity esistenti prima di immettere un valore in modo esplicito tramite SET IDENTITY_INSERT ON.
Se si riutilizza un valore Identity rimosso, utilizzare il codice dell'esempio B per individuare il successivo valore Identity disponibile. Sostituire tablename, column_type e MAX(column_type) - 1 con il nome della tabella, il tipo di dati della colonna Identity e il valore numerico del valore massimo consentito (per il tipo di dati) -1.
Utilizzare l'istruzione DBCC CHECKIDENT per controllare il valore Identity corrente e confrontarlo con il valore massimo nella colonna Identity.
Se una tabella che include una colonna Identity viene pubblicata per la replica, la colonna Identity deve essere gestita in modo adeguato per il tipo di replica utilizzato. Per ulteriori informazioni, vedere Replica di colonne Identity.
Esempi
A. Utilizzo della proprietà IDENTITY con CREATE TABLE
Nell'esempio seguente viene creata una nuova tabella tramite la proprietà IDENTITY per un numero di identificazione a incremento automatico.
USE AdventureWorks2008R2
IF OBJECT_ID ('dbo.new_employees', 'U') IS NOT NULL
DROP TABLE new_employees;
GO
CREATE TABLE new_employees
(
id_num int IDENTITY(1,1),
fname varchar (20),
minit char(1),
lname varchar(30)
);
INSERT new_employees
(fname, minit, lname)
VALUES
('Karin', 'F', 'Josephs');
INSERT new_employees
(fname, minit, lname)
VALUES
('Pirkko', 'O', 'Koskitalo');
B. Utilizzo della sintassi generica per individuare interruzioni nella sequenza di valori Identity
Nell'esempio seguente viene illustrato l'utilizzo di una sintassi generica per individuare le interruzioni nella sequenza di valori Identity create in seguito alla rimozione di dati.
Nota
La prima parte del seguente script Transact-SQL è riportata solo a scopo illustrativo. È possibile eseguire lo script Transact-SQL a partire dal commento -- Create the img table.
-- Here is the generic syntax for finding identity value gaps in data.
-- The illustrative example starts here.
SET IDENTITY_INSERT tablename ON
DECLARE @minidentval column_type
DECLARE @maxidentval column_type
DECLARE @nextidentval column_type
SELECT @minidentval = MIN($IDENTITY), @maxidentval = MAX($IDENTITY)
FROM tablename
IF @minidentval = IDENT_SEED('tablename')
SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('tablename')
FROM tablename t1
WHERE $IDENTITY BETWEEN IDENT_SEED('tablename') AND
@maxidentval AND
NOT EXISTS (SELECT * FROM tablename t2
WHERE t2.$IDENTITY = t1.$IDENTITY +
IDENT_INCR('tablename'))
ELSE
SELECT @nextidentval = IDENT_SEED('tablename')
SET IDENTITY_INSERT tablename OFF
-- Here is an example to find gaps in the actual data.
-- The table is called img and has two columns: the first column
-- called id_num, which is an increasing identification number, and the
-- second column called company_name.
-- This is the end of the illustration example.
-- Create the img table.
-- If the img table already exists, drop it.
-- Create the img table.
IF OBJECT_ID ('dbo.img', 'U') IS NOT NULL
DROP TABLE img
GO
CREATE TABLE img (id_num int IDENTITY(1,1), company_name sysname)
INSERT img(company_name) VALUES ('New Moon Books')
INSERT img(company_name) VALUES ('Lucerne Publishing')
-- SET IDENTITY_INSERT ON and use in img table.
SET IDENTITY_INSERT img ON
DECLARE @minidentval smallint
DECLARE @nextidentval smallint
SELECT @minidentval = MIN($IDENTITY) FROM img
IF @minidentval = IDENT_SEED('img')
SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('img')
FROM img t1
WHERE $IDENTITY BETWEEN IDENT_SEED('img') AND 32766 AND
NOT EXISTS (SELECT * FROM img t2
WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('img'))
ELSE
SELECT @nextidentval = IDENT_SEED('img')
SET IDENTITY_INSERT img OFF
Vedere anche