none
Exportar datos de una tabla a otra RRS feed

  • Pregunta

  • Hola!

    Todos los años en mi empresa creamos las mismas base de datos cambiandole el nombre, por ejemplo Empresa2018 y este año sería Empresa2019, copiamos los datos de Empresa2018 y lo metemos en Empresa2019.

    Lo que suelo hacer es generar un Script con el diseño de la tabla por si se ha modificado o creado algun campo, luego le doy a exportar y ya está.

    El problema lo tengo con los campos ID(Autoincrementales), me toca quitar el campo ID de cada tabla con el diseñador, y luego manualmente voy comprobando el último ID, y le pongo para que siga por ese ID y vuelvo a activarlo.

    ¿ Hay alguna forma mas rápida de hacer esto ? Igual soy muy cómodo yo...jaja

    Saludos.

    jueves, 27 de diciembre de 2018 17:33

Respuestas

  • Lo que puedes hacer es no borrar sino simplemente volver a poner el valor por donde va el identity, para ello puedes modificar ligeramente los siguiente scripts que te voy a poner.

    Primero voy a crear una tabla que sirva de ejemplo 

    create table testautonum (id int identity(1,1) primary key, foo nvarchar(100) default '')
    go
    declare @id int 
    set @id=1000
    while @id>0
    begin
    insert into testautonum default values
    set @id=@id-1
    end

    como ves, la creo y la relleno

    Después vamos a ver si puedo obtener por que identity va 

    select  IDENT_CURRENT('dbo.testautonum')
    select MAX(id) from testautonum

    El resultado es el mismo en ambos casos, 1000

    Así pues si quiero poner el identity a 1000 (para que el siguiente sea 1001 lo que tendré que hacer es, usar dbcc checkident para actualizar ese valor.

    Si además quiero hacerlo de forma semi automatizada, lo que puedo hacer es determinar todas las columnas identity que tengo en mi base de datos. Eso es factible a través del siguiente comando

    select * from INFORMATION_SCHEMA.COLUMNS where COLUMNPROPERTY(OBJECT_ID(table_name),column_name,'IsIdentity')=1

     y ahora se trata de comprobar si podemos obtener el valor actual de identity de todas las tablas de mi base de datos … 

    select IDENT_CURRENT( TABLE_SCHEMA+'.'+TABLE_NAME) from INFORMATION_SCHEMA.COLUMNS where COLUMNPROPERTY(OBJECT_ID(table_name),column_name,'IsIdentity')=1

    y por último, vamos a construir el comando dbcc checkident con esos valores

    select 'dbcc checkident('''+TABLE_SCHEMA+'.'+TABLE_NAME+''', RESEED, ' + coalesce(CAST (IDENT_CURRENT(TABLE_SCHEMA+'.'+TABLE_NAME) as nvarchar(100)),'') +')'
    from   INFORMATION_SCHEMA.COLUMNS where COLUMNPROPERTY(OBJECT_ID(table_name),column_name,'IsIdentity')=1
    

    esto te dará como resultado los comandos, que tu simplemente tienes que copiar, pegar  y ejecutar.

    o bien puedes hacer esta variante

    declare cr cursor for 
    select 'dbcc checkident('''+TABLE_SCHEMA+'.'+TABLE_NAME+''', RESEED, ' + coalesce(CAST (IDENT_CURRENT(TABLE_SCHEMA+'.'+TABLE_NAME) as nvarchar(100)),'') +')'
    from   INFORMATION_SCHEMA.COLUMNS where COLUMNPROPERTY(OBJECT_ID(table_name),column_name,'IsIdentity')=1
    declare @sql nvarchar(1000)
    open cr
    fetch next from cr into @sql
    while @@FETCH_STATUS!=0
     begin
      exec(@sql)
       fetch next from cr into @sql
      end 
    close cr
    deallocate cr
    

    No soy yo especialmente partidario de los cursores, pero esto es una excepción puesto que es una operación puntual de mantenimiento y otra aproximación puede ser mas compleja y lenta. 

    Este script  NO te valdrá tal cual, porque realmente tienes que ejecutarla query en la base de datos vieja y los dbcc checkident en la nueva, estoy seguro que podrás adaptarte a esa restricción.

    Saludos


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

    • Propuesto como respuesta Pedro Alfaro viernes, 28 de diciembre de 2018 20:13
    • Marcado como respuesta Pablo RubioModerator miércoles, 16 de enero de 2019 20:10
    viernes, 28 de diciembre de 2018 8:37
    Moderador

Todas las respuestas

  • Se me ocurre que podrías hacer un backup del 2018 y restaurarlo como 2019. Después entras en el 2019 y haces un DELETE en todas las tablas para vaciarlas de registros. Eso conserva el último valor del ID.

    • Propuesto como respuesta Pedro Alfaro jueves, 27 de diciembre de 2018 20:18
    jueves, 27 de diciembre de 2018 19:55
  • Lo que puedes hacer es no borrar sino simplemente volver a poner el valor por donde va el identity, para ello puedes modificar ligeramente los siguiente scripts que te voy a poner.

    Primero voy a crear una tabla que sirva de ejemplo 

    create table testautonum (id int identity(1,1) primary key, foo nvarchar(100) default '')
    go
    declare @id int 
    set @id=1000
    while @id>0
    begin
    insert into testautonum default values
    set @id=@id-1
    end

    como ves, la creo y la relleno

    Después vamos a ver si puedo obtener por que identity va 

    select  IDENT_CURRENT('dbo.testautonum')
    select MAX(id) from testautonum

    El resultado es el mismo en ambos casos, 1000

    Así pues si quiero poner el identity a 1000 (para que el siguiente sea 1001 lo que tendré que hacer es, usar dbcc checkident para actualizar ese valor.

    Si además quiero hacerlo de forma semi automatizada, lo que puedo hacer es determinar todas las columnas identity que tengo en mi base de datos. Eso es factible a través del siguiente comando

    select * from INFORMATION_SCHEMA.COLUMNS where COLUMNPROPERTY(OBJECT_ID(table_name),column_name,'IsIdentity')=1

     y ahora se trata de comprobar si podemos obtener el valor actual de identity de todas las tablas de mi base de datos … 

    select IDENT_CURRENT( TABLE_SCHEMA+'.'+TABLE_NAME) from INFORMATION_SCHEMA.COLUMNS where COLUMNPROPERTY(OBJECT_ID(table_name),column_name,'IsIdentity')=1

    y por último, vamos a construir el comando dbcc checkident con esos valores

    select 'dbcc checkident('''+TABLE_SCHEMA+'.'+TABLE_NAME+''', RESEED, ' + coalesce(CAST (IDENT_CURRENT(TABLE_SCHEMA+'.'+TABLE_NAME) as nvarchar(100)),'') +')'
    from   INFORMATION_SCHEMA.COLUMNS where COLUMNPROPERTY(OBJECT_ID(table_name),column_name,'IsIdentity')=1
    

    esto te dará como resultado los comandos, que tu simplemente tienes que copiar, pegar  y ejecutar.

    o bien puedes hacer esta variante

    declare cr cursor for 
    select 'dbcc checkident('''+TABLE_SCHEMA+'.'+TABLE_NAME+''', RESEED, ' + coalesce(CAST (IDENT_CURRENT(TABLE_SCHEMA+'.'+TABLE_NAME) as nvarchar(100)),'') +')'
    from   INFORMATION_SCHEMA.COLUMNS where COLUMNPROPERTY(OBJECT_ID(table_name),column_name,'IsIdentity')=1
    declare @sql nvarchar(1000)
    open cr
    fetch next from cr into @sql
    while @@FETCH_STATUS!=0
     begin
      exec(@sql)
       fetch next from cr into @sql
      end 
    close cr
    deallocate cr
    

    No soy yo especialmente partidario de los cursores, pero esto es una excepción puesto que es una operación puntual de mantenimiento y otra aproximación puede ser mas compleja y lenta. 

    Este script  NO te valdrá tal cual, porque realmente tienes que ejecutarla query en la base de datos vieja y los dbcc checkident en la nueva, estoy seguro que podrás adaptarte a esa restricción.

    Saludos


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

    • Propuesto como respuesta Pedro Alfaro viernes, 28 de diciembre de 2018 20:13
    • Marcado como respuesta Pablo RubioModerator miércoles, 16 de enero de 2019 20:10
    viernes, 28 de diciembre de 2018 8:37
    Moderador