SQL 2005 copia una sola columna entre bases de datos
-
09-06-2019 - |
Pregunta
Todavía soy bastante nuevo en T-SQL y SQL 2005.Necesito importar una columna de números enteros de una tabla en la base de datos1 a una tabla idéntica (solo falta la columna que necesito) en la base de datos2.Ambas son bases de datos SQL 2005.Probé el comando de importación integrado en Server Management Studio pero me obliga a copiar la tabla completa.Esto provoca errores debido a restricciones y columnas de "solo lectura" (lo que sea que signifique "solo lectura" en sql2005).Solo quiero tomar una sola columna y copiarla en una tabla.
Debe haber una manera sencilla de hacer esto.Algo como:
INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
Solución
Insertar no funcionará ya que intentará insertar nuevas filas al final de la tabla.Lo que parece que estás intentando hacer es agregar una columna al final de las filas existentes.
No estoy seguro de si la sintaxis es exactamente correcta, pero si te entendí, esto hará lo que buscas.
Cree la columna que permita valores nulos en la base de datos2.
Realizar una actualización:
Actualizar base de datos2.dbo.tableName Establecer database2.dbo.tablename.colname = database1.dbo.tablename.colname de database2.dbo.tableName Inner base de database1.dbo.tablename en database2.dbo.tablename.keycol = database1.dbo.tablename. keycol
Otros consejos
Existe una forma sencilla muy parecida a esta, siempre que ambas bases de datos estén en el mismo servidor.El nombre totalmente calificado es dbname.owner.table: normalmente el propietario es DBO y hay un atajo para ".dbo". que es "..", entonces ...
INSERT INTO Datbase1..MyTable
(ColumnList)
SELECT FieldsIWant
FROM Database2..MyTable
Primero cree la columna si no existe:
ALTER TABLE database2..targetTable
ADD targetColumn int null -- or whatever column definition is needed
y como estás usando Sql Server 2005 puedes usar el nuevo UNIR declaración.El UNIR La declaración tiene la ventaja de poder tratar todas las situaciones en una sola declaración. como filas faltantes del origen (se pueden hacer inserciones), filas faltantes del destino (se pueden eliminar), filas coincidentes (se pueden hacer actualizaciones) y todo se hace de forma atómica en una sola transacción.Ejemplo:
MERGE database2..targetTable AS t
USING (SELECT sourceColumn FROM sourceDatabase1..sourceTable) as s
ON t.PrimaryKeyCol = s.PrimaryKeyCol -- or whatever the match should be bassed on
WHEN MATCHED THEN
UPDATE SET t.targetColumn = s.sourceColumn
WHEN NOT MATCHED THEN
INSERT (targetColumn, [other columns ...]) VALUES (s.sourceColumn, [other values ..])
La declaración MERGE se introdujo para resolver casos como el suyo y recomiendo usarla, es mucho más poderosa que las soluciones que utilizan múltiples declaraciones por lotes de SQL que básicamente logran lo mismo que MERGE en una sola declaración sin la complejidad adicional.
También puedes usar un cursor.Suponiendo que desea iterar todos los registros de la primera tabla y completar la segunda tabla con nuevas filas, algo como esto sería el camino a seguir:
DECLARE @FirstField nvarchar(100)
DECLARE ACursor CURSOR FOR
SELECT FirstField FROM FirstTable
OPEN ACursor
FETCH NEXT FROM ACursor INTO @FirstField
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO SecondTable ( SecondField ) VALUES ( @FirstField )
FETCH NEXT FROM ACursor INTO @FirstField
END
CLOSE ACursor
DEALLOCATE ACursor
MERGE sólo está disponible en SQL 2008, NO en SQL 2005
insertar en Test2.dbo.MyTable (MyValue) seleccionar MyValue de Test1.dbo.MyTable
Esto supone mucho.Primero que la base de datos de destino esté vacía.En segundo lugar, que las otras columnas admiten valores NULL.Es posible que necesites una actualización.Para hacer eso necesitarás tener una clave común.