Pergunta

Ainda sou bastante novo no T-SQL e no SQL 2005.Preciso importar uma coluna de números inteiros de uma tabela no banco de dados1 para uma tabela idêntica (faltando apenas a coluna necessária) no banco de dados2.Ambos são bancos de dados SQL 2005.Eu tentei o comando de importação integrado no Server Management Studio, mas ele está me forçando a copiar a tabela inteira.Isso causa erros devido a restrições e colunas 'somente leitura' (o que quer que 'somente leitura' signifique no sql2005).Eu só quero pegar uma única coluna e copiá-la para uma tabela.

Deve haver uma maneira simples de fazer isso.Algo como:

INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
Foi útil?

Solução

A inserção não funcionará, pois tentará inserir novas linhas no final da tabela.O que parece que você está tentando fazer é adicionar uma coluna ao final das linhas existentes.

Não tenho certeza se a sintaxe está exatamente correta, mas, se entendi você, isso fará o que você procura.

  1. Crie a coluna que permite nulos no banco de dados2.

  2. Execute uma atualização:

    UPDATE database2.dbo.tablename SET database2.dbo.tablename.colname = database1.dbo.tablename.colname FROM database2.dbo.tablename INNER JOIN database1.dbo.tablename ON database2.dbo.tablename.keycol = database1.dbo.tablename. keycol

Outras dicas

Existe uma maneira simples muito parecida com esta, desde que os dois bancos de dados estejam no mesmo servidor.O nome totalmente qualificado é dbname.owner.Table - Normalmente, o proprietário é DBO e há um atalho para ".dbo". que é "..", então ...

INSERT INTO Datbase1..MyTable
    (ColumnList)
SELECT FieldsIWant
  FROM Database2..MyTable

primeiro crie a coluna se ela não existir:

ALTER TABLE database2..targetTable
ADD targetColumn int null -- or whatever column definition is needed

e como você está usando o Sql Server 2005, você pode usar o novo MESCLAR declaração.O MESCLAR declaração tem a vantagem de poder tratar todas as situações em uma declaração como linhas ausentes na origem (pode fazer inserções), linhas ausentes no destino (pode fazer exclusões), linhas correspondentes (pode fazer atualizações) e tudo é feito atomicamente em uma única transação.Exemplo:

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 ..])

A instrução MERGE foi introduzida para resolver casos como o seu e eu recomendo usá-la, é muito mais poderosa do que soluções que usam várias instruções em lote sql que basicamente realizam a mesma coisa que MERGE faz em uma instrução, sem a complexidade adicional.

Você também pode usar um cursor.Supondo que você queira iterar todos os registros da primeira tabela e preencher a segunda tabela com novas linhas, algo assim seria o caminho 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 está disponível apenas no SQL 2008, NÃO no SQL 2005

insira em Test2.dbo.MyTable (MyValue) selecione MyValue em Test1.dbo.MyTable

Isso pressupõe muito.Primeiro que o banco de dados de destino está vazio.Segundo, as outras colunas são anuláveis.Você pode precisar de uma atualização.Para fazer isso, você precisará ter uma chave comum.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top