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
¿Fue útil?

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.

  1. Cree la columna que permita valores nulos en la base de datos2.

  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top