sobrescribir tabla con datos de otra tabla - SQL

9

Nuestros usuarios desean actualizar una base de datos de control de calidad de producción pero quieren dos tablas (llamémoslas T1 y T2) para retener los datos de control de calidad originales. Así que copié dos tablas de QA (DB1) a una base de datos temporal de QA (DB2). Luego refrescó DB1 de producción. Después de la actualización, quiero sobrescribir los datos T1 y T2 de DB2 a DB1 para que puedan contener valores de QA previos a la actualización.

He hecho lo siguiente:

  1. Utilizar

    select * 
    INTO D1.dbo.T1
    FROM D2.dbo.T1
    
  2. Luego actualizado D1 de prod

  3. Luego trunca T1 con el siguiente paso:

    SELECT COUNT(*) AS BeforeTruncateCount
    FROM T1;
    GO
    TRUNCATE TABLE T1;
    GO
    SELECT COUNT(*) AS AfterTruncateCount
    FROM T1;
    GO
    
  4. Ahora, cuando vuelvo a copiar datos de D2.T1 a D1.T1, aparece el error de que ya hay un objeto llamado T1 en la base de datos.

¿Debo dejar caer la mesa y copiar?

¿O hay algún método mejor para todo el procedimiento?

Rizwan
fuente

Respuestas:

6

Para combinar las respuestas de @Kin y @DavidSpillett.

Primero una suposición. DB1 y DB2 están en la misma instancia. Ciertamente parece que lo son, pero nunca está de más decir lo obvio (particularmente porque me he equivocado con lo que pensé que era obvio antes).

Dado que, si los datos son grandes, digamos varios millones de filas, use un paquete SSIS. Esto tiene una característica específica que querrás usar. Puede especificar un tamaño de lote. De esta manera, el tamaño de su transacción será menor. La desventaja del paquete SSIS es que agrega un nivel de complejidad a su proceso. No es grande, pero si está trabajando con una tabla más pequeña, no la necesita.

Lo que nos lleva a la otra opción. Sin embargo, si los datos están en el rango de varios cientos de miles o menos, use un código como este.

USE D1;
GO
TRUNCATE TABLE dbo.T1;
GO
INSERT INTO D1.dbo.T1
SELECT * 
FROM D2.dbo.T1;
GO

Y por último, pero no menos importante, si está en algún lugar del huésped, probaría ambos y vería qué funciona mejor para usted.

NOTA: También puede considerar no usar un SELECT *en el INSERT INTOy, en su lugar, especificar una lista de campos.

Esa estructura se vería así

INSERT INTO D1.dbo.T1 (Field1, Field2)
SELECT Field1, Field2
FROM D2.dbo.T1;
Kenneth Fisher
fuente
Gracias por la info. Sí, la tabla tiene solo 7800 filas, por lo que es bastante pequeña y en la misma instancia. He intentado usar INSERT INTO (sin seleccionar) y funcionó perfectamente. Gracias por compartir esto También lo he probado con Importar datos con SSMS. Eso funcionó muy bien también.
Rizwan
1
Tenga en cuenta que necesitará especificar una lista de campos (y no usarlos *) si hay un campo de identidad en la tabla; esos valores no pueden simplemente "copiarse".
Conrad
6

IIRC con la SELECT <stuff> INTO <target> FROM ...sintaxis SQL Server siempre asume que desea crear la tabla de destino desde cero. Cuando la tabla ya existe, intente en su INSERT <target> SELECT <stuff> FROM ...lugar.

David Spillett
fuente
55
Además, la respuesta de David también es una ruta mejor que DROP y SELECT INTO cuando se mueven los datos de nuevo a D1, porque si elimina las tablas D1, perdería cualquier objeto secundario (es decir, claves foráneas, claves primarias, disparadores, etc. )
Delux
2
Estoy de acuerdo con @Delux. Otra cosa importante que perderá son los permisos explícitos. Si un usuario tiene permisos específicos para esa tabla (en lugar de decir db_datareader), si abandona la tabla, pierde esos permisos.
Kenneth Fisher
Ese es un gran consejo. No entendí las ramificaciones de DROP hasta ahora. ¡Gracias!
Rizwan
6

Lo mejor es usar SSIS (importación / exportación de datos) para hacer esto. Tiene la funcionalidad de simplemente transferir tablas seleccionadas de origen a destino. Opcionalmente, incluso puede guardar el paquete para que pueda reutilizarse para transferencias futuras / repetidas.

EDITAR: Agregar más capturas de pantalla para mayor claridad.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Kin Shah
fuente
wow ... gracias por excelentes capturas de pantalla ... son de gran ayuda
Rizwan
¡Gran solución, buenas capturas de pantalla funcionan!
Mayer Spitzer