Question

Je suis encore relativement nouveau sur T-SQL et SQL 2005.Je dois importer une colonne d'entiers d'une table de la base de données1 vers une table identique (il ne manque que la colonne dont j'ai besoin) dans la base de données2.Les deux sont des bases de données SQL 2005.J'ai essayé la commande d'importation intégrée dans Server Management Studio mais cela m'oblige à copier la table entière.Cela provoque des erreurs dues aux contraintes et aux colonnes « en lecture seule » (quelle que soit la signification de « lecture seule » dans SQL2005).Je veux juste récupérer une seule colonne et la copier dans une table.

Il doit y avoir un moyen simple de procéder.Quelque chose comme:

INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
Était-ce utile?

La solution

L'insertion ne le fera pas car elle tentera d'insérer de nouvelles lignes à la fin du tableau.Il semble que vous essayiez d'ajouter une colonne à la fin des lignes existantes.

Je ne sais pas si la syntaxe est exactement correcte, mais si je vous ai bien compris, cela fera ce que vous recherchez.

  1. Créez la colonne autorisant les valeurs nulles dans la base de données2.

  2. Effectuez une mise à jour :

    Mise à jour de Database2.dbo.tableName set database2.dbo.tablename.colname = database1.dbo.tablename.colname from database2.dbo.tablename inner join database1.dbo.tablename sur database2.dbo.tablename.keycol = database1.dbo.tablenge. keycol

Autres conseils

Il existe un moyen simple très similaire à celui-ci, à condition que les deux bases de données se trouvent sur le même serveur.Le nom entièrement qualifié est dbname.owner.Table - normalement le propriétaire est DBO et il y a un raccourci pour ".dbo". qui est "..", donc ...

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

créez d'abord la colonne si elle n'existe pas :

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

et puisque vous utilisez SQL Server 2005, vous pouvez utiliser le nouveau FUSIONNER déclaration.Le FUSIONNER La déclaration a l'avantage de pouvoir traiter toutes les situations dans une seule déclaration comme les lignes manquantes de la source (peut effectuer des insertions), les lignes manquantes de la destination (peut effectuer des suppressions), les lignes correspondantes (peut effectuer des mises à jour), et tout est fait de manière atomique en une seule transaction.Exemple:

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

L'instruction MERGE a été introduite pour résoudre des cas comme le vôtre et je recommande de l'utiliser, elle est beaucoup plus puissante que les solutions utilisant plusieurs instructions batch SQL qui accomplissent essentiellement la même chose que MERGE fait dans une seule instruction sans la complexité supplémentaire.

Vous pouvez également utiliser un curseur.En supposant que vous souhaitiez parcourir tous les enregistrements de la première table et remplir la deuxième table avec de nouvelles lignes, quelque chose comme ceci serait la voie à suivre :

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 n'est disponible que dans SQL 2008 et NON dans SQL 2005

insérer dans Test2.dbo.MyTable (MyValue) sélectionner MyValue dans Test1.dbo.MyTable

Cela suppose beaucoup.D'abord que la base de données de destination est vide.Deuxièmement, les autres colonnes sont nullables.Vous aurez peut-être besoin d'une mise à jour à la place.Pour ce faire, vous aurez besoin d’une clé commune.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top