Se è necessario modificare in modo specifico il valore della chiave primaria in un numero diverso (ad es. 123 -> 1123). La proprietà identity blocca la modifica di un valore PK. Impostare Identity_insert non funzionerà. Non è consigliabile eseguire un inserimento / eliminazione se si dispone di eliminazioni a cascata (a meno che non si disattivi il controllo di integrità referenziale).
Questo script disattiva l'identità su un PK:
***********************
sp_configure 'allow update', 1
go
reconfigure with override
go
update syscolumns set colstat = 0 --turn off bit 1 which indicates identity column
where id = object_id('table_name') and name = 'column_name'
go
exec sp_configure 'allow update', 0
go
reconfigure with override
go
***********************
Successivamente, puoi impostare le relazioni in modo che aggiornino i riferimenti alle chiavi esterne. Altrimenti devi disattivare l'applicazione delle relazioni. Questo link SO mostra come:
Come si possono disabilitare temporaneamente i vincoli di chiave esterna usando T-SQL?
Ora puoi fare i tuoi aggiornamenti. Ho scritto un breve script per scrivere tutto il mio aggiornamento SQL basato sullo stesso nome di colonna (nel mio caso, avevo bisogno di aumentare il CaseID di 1.000.000:
select
'update ['+c.table_name+'] SET ['+Column_Name+']=['+Column_Name+']+1000000'
from Information_Schema.Columns as c
JOIN Information_Schema.Tables as t ON t.table_Name=c.table_name and t.Table_Schema=c.table_schema and t.table_type='BASE TABLE'
where Column_Name like 'CaseID' order by Ordinal_position
Infine, riattiva l'integrità referenziale e quindi riattiva la colonna Identità sulla chiave primaria.
Nota: vedo alcune persone su queste domande chiedersi PERCHÉ. Nel mio caso, devo unire i dati di una seconda istanza di produzione in un DB master in modo da poter chiudere la seconda istanza. Ho solo bisogno di tutti i dati PK / FK dei dati operativi per non scontrarmi. Gli FK di metadati sono identici.