none
tomar el nombre de la ultima tabla creada en una base RRS feed

  • Pregunta

  • Hola, tengo duda de si lo que intento hacer se puede.

    tengo un script:

    use NPHE
    declare @CLHV2 as nvarchar(255)
    set @CLHV2 ='select * into R_CLHV2 '+'_'+convert(varchar,getdate(),12)+' from CLHV2'
    exec (@CLHV2)

    crea un respaldo de mi información antes de actualizar la base nuevamente con registros nuevos, guarda la información antigua tal y como estaba antes de actualizar a la nueva.

    estas son las basese que se han generado como respaldos de antes:

    • R_CLHV2_201008
    • R_CLHV2_201009
    • R_CLHV2_201012
    • R_CLHV2_201013

    las bases tienen un campo llamado t_alta, es un campo que se genera para saber quien es 1 y quien es 2 por asi decirlo, dicho campo es creado es un update, yo para actualizarlo con lo registros antiguos hago lo siguiente:

    update NPHE.dbo.CLHV2 set t_alta = B.t_alta 
     from NPHE.dbo.CLHV2 A
      left join NPHE.dbo.R_CLHV2_201013 B
         on A.record_id = B.record_id

    eso lo hago manualmente, para actualizar t_alta tengo que entrar al script y modificar el left join a la ultima base de respaldo que se genera, lo que quiero es evitar hacer eso y que lo haga sola, es decir que cada dia que se genere una nueva base de respaldo yo no tenga que cambiar el nombre para actualizar  si no que de alguna forma en el left join el solo tome la ultima base de respaldo creada

    update NPHE.dbo.CLHV2 set t_alta = B.t_alta 
     from NPHE.dbo.CLHV2 A
      left join NPHE.dbo."Ultima base de respaldo creada" B
         on A.record_id = B.record_id

    si no se entiende a que me refiero, puedo intentar explicarme de otra forma.

    Saludos :)


    :)

    martes, 13 de octubre de 2020 15:50

Respuestas

  • Hola Augusto Mejia:

    No es ningún problema hacerlo.


    Tengo una base de datos llamada NPHE, con su tabla dbo.clhv2 con varias columnas, entre ellas t_alta y record_id

    Como puedes ver, estoy situado en la base de datos A (rojo). Ejecuto el script y las dos instrucciones exec sp_executeSql @querySql (azul), devuelven un resultado de 1 fila afectada (verde).

    Ahora refresco la vista de objetos de la base de datos NPHE

    Y tengo las dos tablas, con sus respectivos datos y columnas.

    -- CAPTURAR NOMBRE POR GETDATE()
    declare @fecha varchar(12);
    set @fecha = convert(varchar,getdate(),12);
    
    -- CREAR TABLA CON SELECT INTO
    declare @querySQL nvarchar(4000);
    set @querySQL = N'
    select * 
    	into NPHE.dbo.R_CLHV2_'+@FECHA+'
    	from NPHE.dbo.CLHV2;
    ';
    exec sp_executesql @querySQL;
    
    -- UPDATAR COLUMNA En CLHV2
    set @querySQL = 
    N'
    	update A
    		set t_alta = B.t_alta 
    	from NPHE.dbo.CLHV2 A
    		left join NPHE.dbo.R_CLHV2_'+@FECHA+' B
         on A.record_id = B.record_id;
    ';
    
    exec sp_executesql @querySQL;

    En vez de usar USE, utiliza para el nombre de los objetos "NombreBBDD"."Schema"."NombreTabla".

    En tú caso NPHE.dbo.CLHV2

    Espero te aclarase un poco el asunto.

    • Marcado como respuesta Augusto Mejia miércoles, 14 de octubre de 2020 14:05
    miércoles, 14 de octubre de 2020 4:54

Todas las respuestas

  • Hola Augusto Mejia:

    Realmente, no esta del todo claro. 

    Te voy a contar lo que yo entiendo y como puedes solucionarlo, para llegar al punto que quieres.

    Básicamente es ejecutar querys dinámicas.

    declare @fecha varchar(12);
    set @fecha = convert(varchar,getdate(),12);
    select @fecha
    
    declare @querySQL nvarchar(4000);
    set @querySQL = N'
    declare @CLHV2 as nvarchar(255)
    set @CLHV2 =''select * 
    	into NPHE.dbo.R_CLHV2_'+@fecha+' 
    	from NPHE.dbo.CLHV2;
    -- Fin inserción en tabla 
    	';
    print @querySQL
    --exec (@querySQL)
    
    set @querySQL = 
    N'update NPHE.dbo.CLHV2 
    	set t_alta = B.t_alta 
    	from NPHE.dbo.CLHV2 A
    		left join NPHE.dbo.R_CLHV2_'+@FECHA+' B
         on A.record_id = B.record_id;
    -- Fin script
    ';
    print @querySQL
    --exec @querySQL;

    Primero obtenemos en una variable del script la fecha en formato ISO, para utilizarla como nombre de tabla.

    Luego anexamos a la variable @query, la instrucción tsql que nos interesa pero con el nombre como cadena de la tabla. En vez de usar la instrucción USE, simplemente nos referimos a la misma con el nombre qualificado de 3 partes (bbdd.esquema.tabla).

    La salida retornada por el script es:

    declare @CLHV2 as nvarchar(255)
    set @CLHV2 ='select * 
    	into NPHE.dbo.R_CLHV2_201013 
    	from NPHE.dbo.CLHV2;
    -- Fin inserción en tabla 
    	
    update NPHE.dbo.CLHV2 
    	set t_alta = B.t_alta 
    	from NPHE.dbo.CLHV2 A
    		left join NPHE.dbo.R_CLHV2_201013 B
         on A.record_id = B.record_id;
    -- Fin script

    Si es correcto, quitas los guiones de exec y se los pones a print.

    Otra manera sería utilizar parámetros para exec sp_executeSQL, pero es un poco más complicada.

    ¿Es esto lo que necesitas?

    martes, 13 de octubre de 2020 18:11
  • tu respuesta me ayudo pero no lo comprendo del todo, voy a intentar explicar mejor lo que yo quiero hacer o quiero que pase.

    todos los idas yo creo una tabla con la fecha, ejemplo: 201012 - (año)/(mes)/(dia) la cual cambia todos los dias:

    por ejemplo el dia 12 de octubre se creo la tabla R_CLHV2_201012, entonces aplico esta consulta:

    update NPHE.dbo.CLHV2 set t_alta = B.t_alta from NPHE.dbo.CLHV2 A
      left join NPHE.dbo.R_CLHV2_201012 B
         on A.record_id = B.record_id

    el dia 13 de octubre se creo la tabla R_CLHV2_201013, entonces abro mi script y tengo que modificar el nombre de la tabla de ayer por la de hoy, la tabla de ayer fue R_CLHV2_201012 que es la del 12 de octubre y le cambio el nombre por la tabla de hoy del 13 de octubre R_CLHV2_201013 en el script:

    update NPHE.dbo.CLHV2 set t_alta = B.t_alta from NPHE.dbo.CLHV2 A
      left join NPHE.dbo.R_CLHV2_201013 B
         on A.record_id = B.record_id

    lo que busco es la manera de no tener que abrir el script, para que yo haga un JOB y lo ejecute a las 9 de la mañana, con tu respuesta anterior quise hacer algo para que en la parte de left join pusiera el resultado de la consulta dinámica 

    declare @T_ALTA as nvarchar(255)
    set @T_ALTA= 'select max(TABLE_NAME) from NPHE.INFORMATION_SCHEMA.TABLES'
    exec (@T_ALTA)

    la parte de arriaba me devuelve la ultima tabla que se creo que fue R_CLHV2_201013 y el dia de mañana devolverá la tabla R_CLHV2_201014 que corresponde al 14 de octubre esa tabla se creara mañana

    update NPHE.dbo.CLHV2 set t_alta = B.t_alta 
     from NPHE.dbo.ComoLeHagoV2 A
      left join [Como_le_hago].dbo.@T_ALTA B
         on A.record_id = B.record_id

    lo que se me complica a mi es saber de que modo en esta parte del query:

    left join [Como_le_hago].dbo.@T_ALTA B

    pueda hacerlo solo, sin tener que abrir y modificar el script para decirle que tabla es la de hoy.

    espero haberme explicado mejor y si esto es algo que no se puede hacer o requiere de mas trabajo, no te preocupes, agradezco mucho tu ayuda.

    Gracias


    :)

    martes, 13 de octubre de 2020 20:38
  • Hola Augusto Mejia:

    No es ningún problema hacerlo.


    Tengo una base de datos llamada NPHE, con su tabla dbo.clhv2 con varias columnas, entre ellas t_alta y record_id

    Como puedes ver, estoy situado en la base de datos A (rojo). Ejecuto el script y las dos instrucciones exec sp_executeSql @querySql (azul), devuelven un resultado de 1 fila afectada (verde).

    Ahora refresco la vista de objetos de la base de datos NPHE

    Y tengo las dos tablas, con sus respectivos datos y columnas.

    -- CAPTURAR NOMBRE POR GETDATE()
    declare @fecha varchar(12);
    set @fecha = convert(varchar,getdate(),12);
    
    -- CREAR TABLA CON SELECT INTO
    declare @querySQL nvarchar(4000);
    set @querySQL = N'
    select * 
    	into NPHE.dbo.R_CLHV2_'+@FECHA+'
    	from NPHE.dbo.CLHV2;
    ';
    exec sp_executesql @querySQL;
    
    -- UPDATAR COLUMNA En CLHV2
    set @querySQL = 
    N'
    	update A
    		set t_alta = B.t_alta 
    	from NPHE.dbo.CLHV2 A
    		left join NPHE.dbo.R_CLHV2_'+@FECHA+' B
         on A.record_id = B.record_id;
    ';
    
    exec sp_executesql @querySQL;

    En vez de usar USE, utiliza para el nombre de los objetos "NombreBBDD"."Schema"."NombreTabla".

    En tú caso NPHE.dbo.CLHV2

    Espero te aclarase un poco el asunto.

    • Marcado como respuesta Augusto Mejia miércoles, 14 de octubre de 2020 14:05
    miércoles, 14 de octubre de 2020 4:54
  • Muchas gracias por ayudarme

    :)


    :)

    miércoles, 14 de octubre de 2020 14:06