SQL Server Performance

Identity Columns

Discussion in 'Preguntas sobre SQL Server en Español.' started by emadrigal, Jun 16, 2004.

  1. emadrigal New Member

    Hola grupo!. Tengo la siguiente situación:
    Tengo una tabla que que estoy llenando y vaciando periódicamente. Esta tabla tiene un campo Identidad, el problema ocurre cuando vuelvo a llenarla después de haberla borrado, ya que el campo identidad conserva la numeración del último registro y a los nuevos registros los numera a partir del número que quedó registrado como último. ¿Cómo hacer para regresar esta numeración al #1 nuevamente?. He intentado con la instrucción "SET IDENTITY_INSERT table ON", pero hay que estar indicando constantemente el número correspondiente a la columna Identidad, y la carga de información a la tabla se realizan mediante la ejecución de un DTS package, por lo que no puedo estarle indicando línea por línea de inserción el número que le corresponde al campo Identidad de la tabla.
    Espero me puedan ayudar con este problema.
    Gracias.

    Enrique.



    Enrique Madrigal
  2. Luis Martin Moderator

    El siguiente ejemplo crea una tabla con identificador de columnas y muestra como SET IDENTITY_INSERT puede ser usado para llenar el gap en los valores causados por la sentencia DELETE.

    -- Create products table.
    CREATE TABLE products (id int IDENTITY PRIMARY KEY, product varchar(40))
    GO
    -- Inserting values into products table.
    INSERT INTO products (product) VALUES ('screwdriver')
    INSERT INTO products (product) VALUES ('hammer')
    INSERT INTO products (product) VALUES ('saw')
    INSERT INTO products (product) VALUES ('shovel')
    GO

    -- Create a gap in the identity values.
    DELETE products
    WHERE product = 'saw'
    GO

    SELECT *
    FROM products
    GO

    -- Attempt to insert an explicit ID value of 3;
    -- should return a warning.
    INSERT INTO products (id, product) VALUES(3, 'garden shovel')
    GO
    -- SET IDENTITY_INSERT to ON.
    SET IDENTITY_INSERT products ON
    GO

    -- Attempt to insert an explicit ID value of 3
    INSERT INTO products (id, product) VALUES(3, 'garden shovel').
    GO

    SELECT *
    FROM products
    GO
    -- Drop products table.
    DROP TABLE products
    GO

    Puede ser lo anterior la solución?



    Luis Martin
    Moderator
    SQL-Server-Performance.com

    All postings are provided “AS IS” with no warranties for accuracy.

  3. emadrigal New Member

    Muchas gracias Luis.
    El código que me mandas me funciona para hacer inserciones indicando el número de la campo identidad que se necesita para el registro a insertar. ¿Pero cómo hacer si quiero que comience desde el #1, y además tengo que cargar todos los registros de una tabla y no solo un registro?. En este tipo de acutalización del Identity Column necesito indicar el # que quiero el el campo identidad y puedo indicárselo si la actualización se hace desde la ejecución de un DTS package. ¿Existe alguna instrucción para regresar la numeración de la tabla al indicado en el parámetro "seed", que en el caso de mi tabla es el #1?
    Gracias nuevamente.


    Enrique Madrigal
  4. Luis Martin Moderator

    Enrique:

    Dame un tiempo que voy a consultar con los expertos en DTS.


    Luis Martin
    Moderator
    SQL-Server-Performance.com

    All postings are provided “AS IS” with no warranties for accuracy.

  5. Luis Martin Moderator

    Si la tabla es TRUNCATED con la sentencia TRUNCATE TABLE..., entonces el valor de Indentity comenzará desde el principio nuevamente.


    Luis Martin
    Moderator
    SQL-Server-Performance.com

    All postings are provided “AS IS” with no warranties for accuracy.

  6. emadrigal New Member

    Cierto!. Ya lo he probado y funciona.
    Muchas gracias por tu ayuda Luis.

    Enrique Madrigal

    Enrique Madrigal
  7. Raulie New Member

    El TRUNCATE trabaja más rápidamente puesto que no se registra las bajas en el Transaction LOG, sin embargo si la recuperación es una alta prioridad yo recomiende que utilize el DELETE commando y applice este DBCC comando en la table.

    DBCC CHECKIDENT(MyTable,RESEED,0) [8D]

    esto es otra solucion mas segura.

Share This Page