none
Colocar condicion a Autoincrementable RRS feed

  • Pregunta

  • Buenas tardes.

    Junto con saludar les comento el siguiente problema que se me presenta, tengo una tabla en sql y debo ser capaz de insertar automaticamente un correlativo y se me ocurre que puedo usar el autoincrementable pero tambien debo ser capaz de resetear ese autoincrementable es decir llegar a un punto y decir vuelves a numero inicial 1 ademas debe ser capaz de incrementar segun una condición por ejemplo nombre:

    Nombre     incrementable

    Sebastian           1

    Sebastian           2

    Sebastian           3

    Sebastian           4

    Nombre     incrementable

    Juan           1

    Juan           2

    Juan           3

    Juan           4

    Alguien se le ocurre como hacer algo asi?

    Desde ya muchas gracias.


    Sebastian Peralta

    miércoles, 8 de noviembre de 2017 19:06

Respuestas

  • Hola.

    Te paso un ejemplo:

    CREATE TABLE TABLA(
    ID int IDENTITY,
    NOMBRE varchar(200)

    GO

    INSERT INTO TABLA VALUES ('SEBASTIAN')
    INSERT INTO TABLA VALUES ('SEBASTIAN')
    INSERT INTO TABLA VALUES ('SEBASTIAN')

    Select * From Tabla

    DBCC CHECKIDENT (TABLA, RESEED, 0)

    INSERT INTO TABLA VALUES ('JUAN')
    INSERT INTO TABLA VALUES ('JUAN')
    INSERT INTO TABLA VALUES ('JUAN')

    Debes tener cuidado con el valor que reseteas el IDENTITY, que en este caso fue 0

    Saludos.

    Cristian.


    DBA SQL Server Santiago/Chile


    • Editado CMAPM miércoles, 8 de noviembre de 2017 19:29
    • Marcado como respuesta Sebastian Peralta jueves, 9 de noviembre de 2017 14:29
    miércoles, 8 de noviembre de 2017 19:27
  • Por eso le decia que debe tener ojo con el reset, mira, aca con comentarios:

    Lo malo es que cada vez que tengas que hacer un INSERT tendrás que sacar el MAX() del dato que insertaras y luego usar el reset antes del INSERT.

    La pregunta que yo me haria es porque deseas algo asi:

    Saludos


    CREATE TABLE TABLA(
    ID int IDENTITY,
    NOMBRE varchar(200)

    GO

    INSERT INTO TABLA VALUES ('SEBASTIAN')
    INSERT INTO TABLA VALUES ('SEBASTIAN')
    INSERT INTO TABLA VALUES ('SEBASTIAN')

    Select * From Tabla

    DBCC CHECKIDENT (TABLA, RESEED, 0)

    INSERT INTO TABLA VALUES ('JUAN')
    INSERT INTO TABLA VALUES ('JUAN')
    INSERT INTO TABLA VALUES ('JUAN')

    Select * From Tabla

    --Ahora queremos insertar nuevos datos de SEBASTIAN
    Select MAX(ID) FROM TABLA WHERE NOMBRE = 'SEBASTIAN'
    --Como vemos el max es 3, entonces:

    DBCC CHECKIDENT (TABLA, RESEED, 3)
    INSERT INTO TABLA VALUES ('SEBASTIAN')
    INSERT INTO TABLA VALUES ('SEBASTIAN')

    Select * From Tabla
    --Ahora si hacemos un INSERT para JUAN sera el 6 y se requiere sea el ID 4, entonces se debe sacar nuevamente el MAX, para JUAN:

    Select MAX(ID) FROM TABLA WHERE NOMBRE = 'JUAN'

    DBCC CHECKIDENT (TABLA, RESEED, 3)

    INSERT INTO TABLA VALUES ('JUAN')

    Select * From Tabla


    DBA SQL Server Santiago/Chile

    miércoles, 8 de noviembre de 2017 20:17
  • Hola.

    Olvidate del IDENTITY, el correlativo lo vas haciendo tu mismo con el MAX(), para que no exista mas de 1 solicitud a la vez tendrás que bloquear, te dejo un link:

    https://docs.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql

    Saludos.


    DBA SQL Server Santiago/Chile

    jueves, 9 de noviembre de 2017 13:51

Todas las respuestas

  • Hola.

    Te paso un ejemplo:

    CREATE TABLE TABLA(
    ID int IDENTITY,
    NOMBRE varchar(200)

    GO

    INSERT INTO TABLA VALUES ('SEBASTIAN')
    INSERT INTO TABLA VALUES ('SEBASTIAN')
    INSERT INTO TABLA VALUES ('SEBASTIAN')

    Select * From Tabla

    DBCC CHECKIDENT (TABLA, RESEED, 0)

    INSERT INTO TABLA VALUES ('JUAN')
    INSERT INTO TABLA VALUES ('JUAN')
    INSERT INTO TABLA VALUES ('JUAN')

    Debes tener cuidado con el valor que reseteas el IDENTITY, que en este caso fue 0

    Saludos.

    Cristian.


    DBA SQL Server Santiago/Chile


    • Editado CMAPM miércoles, 8 de noviembre de 2017 19:29
    • Marcado como respuesta Sebastian Peralta jueves, 9 de noviembre de 2017 14:29
    miércoles, 8 de noviembre de 2017 19:27
  • Estimado, su ejemplo me ayuda un poco, pero debo ser capas sobre el mismo ejemplo en algun momento determinado seguir insertando a Sebastian o Juan aleatoriamente incrementando sus correlativos por separado. Si fuera posible eso solucionaría mi problema.

    Sebastian Peralta

    miércoles, 8 de noviembre de 2017 19:41
  • Por eso le decia que debe tener ojo con el reset, mira, aca con comentarios:

    Lo malo es que cada vez que tengas que hacer un INSERT tendrás que sacar el MAX() del dato que insertaras y luego usar el reset antes del INSERT.

    La pregunta que yo me haria es porque deseas algo asi:

    Saludos


    CREATE TABLE TABLA(
    ID int IDENTITY,
    NOMBRE varchar(200)

    GO

    INSERT INTO TABLA VALUES ('SEBASTIAN')
    INSERT INTO TABLA VALUES ('SEBASTIAN')
    INSERT INTO TABLA VALUES ('SEBASTIAN')

    Select * From Tabla

    DBCC CHECKIDENT (TABLA, RESEED, 0)

    INSERT INTO TABLA VALUES ('JUAN')
    INSERT INTO TABLA VALUES ('JUAN')
    INSERT INTO TABLA VALUES ('JUAN')

    Select * From Tabla

    --Ahora queremos insertar nuevos datos de SEBASTIAN
    Select MAX(ID) FROM TABLA WHERE NOMBRE = 'SEBASTIAN'
    --Como vemos el max es 3, entonces:

    DBCC CHECKIDENT (TABLA, RESEED, 3)
    INSERT INTO TABLA VALUES ('SEBASTIAN')
    INSERT INTO TABLA VALUES ('SEBASTIAN')

    Select * From Tabla
    --Ahora si hacemos un INSERT para JUAN sera el 6 y se requiere sea el ID 4, entonces se debe sacar nuevamente el MAX, para JUAN:

    Select MAX(ID) FROM TABLA WHERE NOMBRE = 'JUAN'

    DBCC CHECKIDENT (TABLA, RESEED, 3)

    INSERT INTO TABLA VALUES ('JUAN')

    Select * From Tabla


    DBA SQL Server Santiago/Chile

    miércoles, 8 de noviembre de 2017 20:17
  • No existe forma de configurar la secuencia en base al valor de otra columna, no con IDENTITY, no con SEQUENCE. No digo que no sea posible realizar lo que requieres, pero no existe automatización para ello, tendrás que generar la secuencia por cuenta propia y olvidarte de IDENTITY o SEQUENCE.

    jueves, 9 de noviembre de 2017 0:30
  • Resetear y buscar el máximo me sirve mucho, pero solo me salta la ultima duda que la planteo de la siguiente manera 

    USE [BD]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[CODIGO] 
    (@ORDEN VARCHAR(10)) AS BEGIN 
    DECLARE @MAXIMO INT 
    SET @MAXIMO=(SELECT MAX(ID) FROM TABLA WHERE NOMBRE=@ORDEN) 
    DBCC CHECKIDENT (TABLA, RESEED, @MAXIMO)

    INSERT INTO TABLA VALUES (@ORDEN)

    END

    El codigo lo e logrado pasar a un procedimiento almacenado, pero me salta la siguiente duda, que pasara si este procedimiento lo ejecuta al mismo tiempo 2 o 3 computadoras, sql es capas de controlar el orden de la solicitud y luego pasar al siguiente. Ejemplo:

    Si dos equipos al mismo tiempo ejecutan buscar a Juan y el codigo les devuelve el max (ejemplo 3) ambos equipos insertaran el 4?  Ahora que explique todo esta es la consulta real por lo que se me ocurre el identity, lo explique de esta forma ya que si lo realizo con la solicitud no se entenderá, pero como para entender porque necesito esto, se los comento:

    Necesito crear un codigo de barra de 20 digitos el cual en una parte de este codigo me solicitan realizar un conteo de 0001 hasta 9999 pero este conteo finalizara cuando se termine un pedido, es decir si un pedido que tenga el identificador es 10 este empezara a contar la secuencia 1.2.3.4.5 ETC, si en otro equipo se hace al mismo tiempo otro pedido 11 este debe empezar de 1.2.3.4.5 ETC si otro al mismo tiempo se le ocurre generar el pedido 10 este buscara el maximo y como en este ejemplo termino en 5 este debe ser capaz de seguir con el 6.7.8.9 ETC es por eso pensaba de esta manera resolver el problema. Ya que si el correlativo lo inserto desde codigo C# en este caso, veo que sera mas problema ir a consultar el maximo e insertar, ya que asi e comprobado que puedo insertar dos correlativos iguales para un pedido. Espero se entienda el problema pero en definitiva mi consulta es formulada con negrita.

    Desde ya muchas gracias, por las respuestas comentadas.


    Sebastian Peralta


    jueves, 9 de noviembre de 2017 12:45
  • Hola.

    Olvidate del IDENTITY, el correlativo lo vas haciendo tu mismo con el MAX(), para que no exista mas de 1 solicitud a la vez tendrás que bloquear, te dejo un link:

    https://docs.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql

    Saludos.


    DBA SQL Server Santiago/Chile

    jueves, 9 de noviembre de 2017 13:51
  • Perfecto muchas gracias.

    Sebastian Peralta

    jueves, 9 de noviembre de 2017 14:29