2010-10-08 19 views
8

Tengo dos tablas con estructura idéntica y MUY GRANDE número de campos (aproximadamente 1000). Necesito realizar 2 operaciones 1) Insertar de la segunda tabla todas las filas en el puño. Ejemplo:¿Cómo actualizar una tabla desde otra sin especificar los nombres de las columnas?

INSERT INTO [1607348182] 
SELECT * 
FROM _tmp_1607348182; 

2) Modificar la primera tabla de la segunda tabla pero para la actualización i no puede encontrado sintaxis SQL adecuada para la actualización.

consultas como:

Update [1607348182] 
set [1607348182].* = tmp.* 
from [1607348182] 
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid 

o

Update [1607348182] 
from [1607348182] 
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid 

no son válidos.

+3

Recomendaría usar un 'TRIGGER' o modificar su esquema para que no tenga que hacer esto. –

+0

No entiendo. Después de su primera actualización, las dos tablas contendrán filas idénticas, entonces, ¿qué espera que haga la segunda actualización? – PaulG

+0

Travis G, estoy de acuerdo con usted para modificar el esquema de db, pero desafortunadamente debería seguir este esquema en mi proyecto. – amuliar

Respuesta

3

No estoy seguro si podrá lograr esto sin usar sql dinámico para construir la declaración de actualización en una variable.

Esta declaración devolverá una lista de columnas en base al nombre de la tabla se pone en:

select name from syscolumns 
where [id] = (select [id] from sysobjects where name = 'tablename') 

No estoy seguro si puedo evitar un bucle aquí .... que necesita para cargar los resultados de arriba en un cursor y luego construir una consulta desde él. Psuedo codificado:

set @query = 'update [1607348182] set ' 
load cursor --(we will use @name to hold the column name) 
while stillrecordsincursor 
set @query = @query + @name + ' = tmp_[1607348182]. ' [email protected] + ',' 
load next value from cursor 
loop! 

Cuando la consulta se realiza en construcción en el bucle, utilice @query sp_executesql Exec.

Solo una pequeña advertencia ... construir un sql dinámico en un bucle como este puede ser un poco confuso. Para solucionar problemas, coloca una @query selecta en el ciclo y mira cómo se construye @query.

editar: No estoy seguro si podrá hacer todas las 1000 filas en una actualización a la vez ... hay límites lógicos (varchar (8000)?) En el tamaño que @query también puede crecer. Puede que tenga que dividir el código para que maneje 50 columnas a la vez. Coloque las columnas de la declaración de selección syscolumns en una tabla temporal con un id. Y cree su sql dinámico para que actualice 20 columnas (¿o 50?) A la vez.

Otra alternativa sería utilizar Excel para construir en masa esto. Haga la columna seleccionar y copiar los resultados en la columna a de una hoja de cálculo. Put '= en la columna b, tmp. [12331312] en la columna c, copie la columna a en la columna D, y una coma en la columna e. Copie la hoja de cálculo completa en un bloc de notas, y debe tener las columnas de la declaración de actualización desarrolladas para usted. No es una mala solución si se trata de un evento de una sola toma, no estoy seguro de si confiaría en esto como una solución en curso.

+0

Parece ser una mejor solución porque no hay una expresión nativa en sql para hacer eso. También tuve problemas con otras limitaciones de SQL Server relacionadas con columnas de tamaño variable.(También me doy cuenta de que mis problemas provienen del mal esquema DB) Así que su solución parece ser la mejor porque puedo guardar en caché esta declaración SQL y reutilizarla más tarde en otras solicitudes. – amuliar

+0

Acerca de la limitación varchar (8000). Puedo crear varchar (MAX) de todos modos – amuliar

+0

Buen punto, he estado trabajando recientemente en bases de datos heredadas y olvidé sobre varchar (max). Con respecto al pobre esquema db ... supongo que estás trabajando desde un esquema antiguo (raramente ves tablas llamadas números fuera de archivos planos/IDBMS). Una importación nocturna desde el sistema heredado a una base de datos normalizada puede ser una buena opción para considerar, de lo contrario, está mirando una cantidad relativamente grande de tiempo dedicado a trabajar con este esquema deficiente que se agregará a cada proyecto que realice. – Twelfth

5

¿Funcionaría eliminar todo de la tabla maestra que tenía una ID en temperatura, luego hacer una inserción con los datos nuevos?

+0

Sí, me di cuenta de esta solución y la implementé. Gracias – amuliar

Cuestiones relacionadas