Script para inicializar propiedad Identity.

27/11/2007 - 20:58 por Mario | Informe spam
Hola, mi problema es el siguiente:
Necesito hacer un script para que todos los campos de las tablas de una BD
que tengan la propiedad "identity" activada se reinicialicen para que se
inserten registros a partir del 1.
He averiguado que el campo Status de syscolumns determina si es o no
identidad meiante el bit nº 7.
He hecho un script que localiza todos los campos dela BD de este tipo.
Intento desactivar ese bit y luego volverlo a activar con sendos updates
para que se reinicie la cuenta. No sé si es buena idea, pero es la única que
se me ocurre.
Lo malo es que no me deja actualizar syscolumns Ad Hoc.
Alguien me puede decir cómo hacer este "reset" de las identidades, por favor?

Gracias por la atención prestada.

Preguntas similare

Leer las respuestas

#1 Mario
27/11/2007 - 21:03 | Informe spam
Perdón por el descuido, hablamos de "SQL Server 2005"

"Mario" wrote:

Hola, mi problema es el siguiente:
Necesito hacer un script para que todos los campos de las tablas de una BD
que tengan la propiedad "identity" activada se reinicialicen para que se
inserten registros a partir del 1.
He averiguado que el campo Status de syscolumns determina si es o no
identidad meiante el bit nº 7.
He hecho un script que localiza todos los campos dela BD de este tipo.
Intento desactivar ese bit y luego volverlo a activar con sendos updates
para que se reinicie la cuenta. No sé si es buena idea, pero es la única que
se me ocurre.
Lo malo es que no me deja actualizar syscolumns Ad Hoc.
Alguien me puede decir cómo hacer este "reset" de las identidades, por favor?

Gracias por la atención prestada.

Respuesta Responder a este mensaje
#2 Alejandro Mesa
27/11/2007 - 21:33 | Informe spam
Mario,

Solo deseas re-inicializar la columna con propiedad identity?

Si es asi, entonces chequea el comando DBCC CHECKIDENT, el cual se usa para
inicializar la semilla. Tendras que crear un cursor para recorrer las filas
de la vista INFORMATION_SCHEMA.COLUMNS que cumplan que tienen propiedad
identity. Deberas armar una sentencia dinamica y ejecutarla con sp_executesql.

DECLARE @seed int
DECLARE @sql NVARCHAR(4000)
DECLARE @ts sysname
DECLARE @tn sysname
DECLARE c CURSOR LOCAL FAST_FORWARD
FOR
SELECT table_schema, table_name
FROM information_schema.columns
WHERE COLUMNPROPERTY(OBJECT_ID(QUOTENAME(table_schema) + '.' +
QUOTENAME(table_name)), column_name, 'IsIdentity') = 1

OPEN c

WHILE 1 = 1
BEGIN
FETCH NEXT FROM c INTO @ts, @tn

IF @@ERROR != 0 OR @@FETCH_STATUS != 0 BREAK

SET @seed = IDENT_SEED (QUOTENAME(@ts) + N'.' + QUOTENAME(@tn))
SET @sql = N'dbcc checkident (''' + QUOTENAME(@ts) + N'.' + QUOTENAME(@tn)
+ N''', RESEED, ' + LTRIM(@seed - 1) + N')'

PRINT @sql
END

CLOSE c
DEALLOCATE c
GO

Estoy asumiendo que todas esas columnas son tipo INT, asi que en tu caso, si
no lo son vas a tener que ajuster el script.

AMB


"Mario" wrote:

Perdón por el descuido, hablamos de "SQL Server 2005"

"Mario" wrote:

> Hola, mi problema es el siguiente:
> Necesito hacer un script para que todos los campos de las tablas de una BD
> que tengan la propiedad "identity" activada se reinicialicen para que se
> inserten registros a partir del 1.
> He averiguado que el campo Status de syscolumns determina si es o no
> identidad meiante el bit nº 7.
> He hecho un script que localiza todos los campos dela BD de este tipo.
> Intento desactivar ese bit y luego volverlo a activar con sendos updates
> para que se reinicie la cuenta. No sé si es buena idea, pero es la única que
> se me ocurre.
> Lo malo es que no me deja actualizar syscolumns Ad Hoc.
> Alguien me puede decir cómo hacer este "reset" de las identidades, por favor?
>
> Gracias por la atención prestada.
>
Respuesta Responder a este mensaje
#3 Mario
28/11/2007 - 12:15 | Informe spam
Perfecto!!!

Muchas gracias, Alejandro.



"Alejandro Mesa" wrote:

Mario,

Solo deseas re-inicializar la columna con propiedad identity?

Si es asi, entonces chequea el comando DBCC CHECKIDENT, el cual se usa para
inicializar la semilla. Tendras que crear un cursor para recorrer las filas
de la vista INFORMATION_SCHEMA.COLUMNS que cumplan que tienen propiedad
identity. Deberas armar una sentencia dinamica y ejecutarla con sp_executesql.

DECLARE @seed int
DECLARE @sql NVARCHAR(4000)
DECLARE @ts sysname
DECLARE @tn sysname
DECLARE c CURSOR LOCAL FAST_FORWARD
FOR
SELECT table_schema, table_name
FROM information_schema.columns
WHERE COLUMNPROPERTY(OBJECT_ID(QUOTENAME(table_schema) + '.' +
QUOTENAME(table_name)), column_name, 'IsIdentity') = 1

OPEN c

WHILE 1 = 1
BEGIN
FETCH NEXT FROM c INTO @ts, @tn

IF @@ERROR != 0 OR @@FETCH_STATUS != 0 BREAK

SET @seed = IDENT_SEED (QUOTENAME(@ts) + N'.' + QUOTENAME(@tn))
SET @sql = N'dbcc checkident (''' + QUOTENAME(@ts) + N'.' + QUOTENAME(@tn)
+ N''', RESEED, ' + LTRIM(@seed - 1) + N')'

PRINT @sql
END

CLOSE c
DEALLOCATE c
GO

Estoy asumiendo que todas esas columnas son tipo INT, asi que en tu caso, si
no lo son vas a tener que ajuster el script.

AMB


"Mario" wrote:

> Perdón por el descuido, hablamos de "SQL Server 2005"
>
> "Mario" wrote:
>
> > Hola, mi problema es el siguiente:
> > Necesito hacer un script para que todos los campos de las tablas de una BD
> > que tengan la propiedad "identity" activada se reinicialicen para que se
> > inserten registros a partir del 1.
> > He averiguado que el campo Status de syscolumns determina si es o no
> > identidad meiante el bit nº 7.
> > He hecho un script que localiza todos los campos dela BD de este tipo.
> > Intento desactivar ese bit y luego volverlo a activar con sendos updates
> > para que se reinicie la cuenta. No sé si es buena idea, pero es la única que
> > se me ocurre.
> > Lo malo es que no me deja actualizar syscolumns Ad Hoc.
> > Alguien me puede decir cómo hacer este "reset" de las identidades, por favor?
> >
> > Gracias por la atención prestada.
> >
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida