none
Columna Identity RRS feed

  • Pregunta

  • Hola buen dia, tengo una duda referente a los valores Identity de SQL Server, ya que tengo una tabla, la cual tiene una columna que es de tipo Identity. Hasta aquí no hay ningún problema, la situación es que está se usa dentro de una aplicación, y ahora yo estoy desarrollando algún modulo que también hace uso de esta tabla, pero en el modulo que debo realizar el folio debe seguir un patrón (Ej. 201600001), que por lo regular inicia con el año, y mi duda es si puede haber conflictos al insertar datos en alguna de las dos aplicación, o si puede sobre-escribirse datos al tener el mismo valor al intentar insertar un nuevo registro.

    Espero y me puedan entender, gracias.

    martes, 1 de noviembre de 2016 18:22

Respuestas

  • La columna identity sera transparente para cualquier aplicacion ya que SQL Server administra esta. Osea no importa de donde venga el inserte esta sera incrementando.

    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    • Marcado como respuesta JorgeNin92 miércoles, 2 de noviembre de 2016 16:55
    martes, 1 de noviembre de 2016 18:28
  • El servidor SQL genera automáticamente los valores del Identity. Mientras le dejes que los genere nunca hay conflictos entre dos aplicaciones. Te dará un error si desde algina aplicación intentas grabarle un valor concreto tal como 201600001; es obligatorio omitir el valor del identity en las sentencias Insert.

    Es factible forzarlo a que admita valores concretos (set identity insert on), pero si haces esto entonces sí que puede haber conflictos entre dos aplicaciones, pudiéndose duplicar un valor.

    • Marcado como respuesta JorgeNin92 miércoles, 2 de noviembre de 2016 16:53
    martes, 1 de noviembre de 2016 22:35
  • yo en tu caso lo haría con este procedi
    create table valores(anio smallint, contador int);
    go
    create procedure SiguienteValor(@fecha datetime) as
    begin
     declare @mytran bit
     declare @valor int
     set @mytran=0
      if @@TRANCOUNT=0 
       begin
        set @mytran=1
        begin tran
       end
       update valores set @valor=contador=contador+1 from valores where anio=year(@fecha)
       if @valor is null
         begin
    	  insert into valores select year(@fecha),1
    	  set @valor=1
    	 end
     if @mytran=1
      commit tran
      set @valor=year(@Fecha)*100000+@valor
      return @valor
    end
    go
    declare @contador int
    declare @fecha datetime=getdate()
    exec @contador=SiguienteValor @fecha
    select @contador
    

    miento para devolver el siguiente ordinal

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta JorgeNin92 miércoles, 2 de noviembre de 2016 16:55
    miércoles, 2 de noviembre de 2016 7:03
    Moderador

Todas las respuestas

  • La columna identity sera transparente para cualquier aplicacion ya que SQL Server administra esta. Osea no importa de donde venga el inserte esta sera incrementando.

    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    • Marcado como respuesta JorgeNin92 miércoles, 2 de noviembre de 2016 16:55
    martes, 1 de noviembre de 2016 18:28
  • El servidor SQL genera automáticamente los valores del Identity. Mientras le dejes que los genere nunca hay conflictos entre dos aplicaciones. Te dará un error si desde algina aplicación intentas grabarle un valor concreto tal como 201600001; es obligatorio omitir el valor del identity en las sentencias Insert.

    Es factible forzarlo a que admita valores concretos (set identity insert on), pero si haces esto entonces sí que puede haber conflictos entre dos aplicaciones, pudiéndose duplicar un valor.

    • Marcado como respuesta JorgeNin92 miércoles, 2 de noviembre de 2016 16:53
    martes, 1 de noviembre de 2016 22:35
  • yo en tu caso lo haría con este procedi
    create table valores(anio smallint, contador int);
    go
    create procedure SiguienteValor(@fecha datetime) as
    begin
     declare @mytran bit
     declare @valor int
     set @mytran=0
      if @@TRANCOUNT=0 
       begin
        set @mytran=1
        begin tran
       end
       update valores set @valor=contador=contador+1 from valores where anio=year(@fecha)
       if @valor is null
         begin
    	  insert into valores select year(@fecha),1
    	  set @valor=1
    	 end
     if @mytran=1
      commit tran
      set @valor=year(@Fecha)*100000+@valor
      return @valor
    end
    go
    declare @contador int
    declare @fecha datetime=getdate()
    exec @contador=SiguienteValor @fecha
    select @contador
    

    miento para devolver el siguiente ordinal

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta JorgeNin92 miércoles, 2 de noviembre de 2016 16:55
    miércoles, 2 de noviembre de 2016 7:03
    Moderador
  • Gracias por la respuesta, ya lo logre solucionar, dejando el valor como IDENTIY, ya que al hacer pruebas e intentar insertar algun valor como menciona Carlos Ignacio Cba tuve conflictos, es por esto que mi columna se queda como IDENTITY,

    Gracias por la respuesta.

    miércoles, 2 de noviembre de 2016 16:52