2009-02-20 7 views
2

J'apprécierais de vous aider à créer un script SQL pour copier des données d'une table à l'autre. Essentiellement, ce que je dois faire pour chaque ligne de la table source est d'agréger les valeurs de la colonne et de les stocker dans une seule colonne dans la table cible. Ainsi, ColumnX doit ressembler à "ColumnA, ColumnB, ColumnC". En outre, j'ai besoin de garder une trace de chaque mappage TableA.ID -> SCOPE_IDENTITY() afin de mettre à jour une troisième table.Script SQL pour agréger les valeurs des colonnes

merci d'avance!

EDIT: TableA.ID n'est pas identique à TableB.Identity. TableB.Identity renverra une nouvelle valeur d'identité lors de l'insertion. donc soit j'ai besoin de stocker le mappage dans une table temporaire ou mettre à jour TableC avec chaque insertion dans TableB.

+0

La colonne A, la colonne B, la colonne C sont-elles distinctes à travers la table? –

Répondre

3

Voici une ligne par ligne exemple de traitement. Cela vous fournira les résultats d'une manière où vous pouvez traiter chaque ligne à la fois. Ou vous pouvez utiliser TableC à la fin et faire le traitement que vous avez besoin de faire.

Cependant, cela serait beaucoup plus rapide si vous ajoutiez une colonne supplémentaire à TableB (appelée TableA_ID) et que vous insériez simplement le résultat dedans. Vous auriez un accès instantané à TableA.ID et à TableB.Identity. Mais sans connaître votre situation exacte, cela peut ne pas être réalisable. (Mais vous pouvez toujours ajouter la colonne puis déposez-après!)

USE tempdb 
GO 

CREATE TABLE TableA (
    ID int NOT NULL PRIMARY KEY, 
    ColumnA varchar(10) NOT NULL, 
    ColumnB varchar(10) NOT NULL, 
    ColumnC varchar(10) NOT NULL 
) 

CREATE TABLE TableB (
    [Identity] int IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    ColumnX varchar(30) NOT NULL 
) 

CREATE TABLE TableC (
    TableA_ID int NOT NULL, 
    TableB_ID int NOT NULL, 
    PRIMARY KEY (TableA_ID, TableB_ID) 
) 

GO 

INSERT INTO TableA VALUES (1, 'A', 'A', 'A') 
INSERT INTO TableA VALUES (2, 'A', 'A', 'B') 
INSERT INTO TableA VALUES (3, 'A', 'A', 'C') 
INSERT INTO TableA VALUES (11, 'A', 'B', 'A') 
INSERT INTO TableA VALUES (12, 'A', 'B', 'B') 
INSERT INTO TableA VALUES (13, 'A', 'B', 'C') 
INSERT INTO TableA VALUES (21, 'A', 'C', 'A') 
INSERT INTO TableA VALUES (22, 'A', 'C', 'B') 
INSERT INTO TableA VALUES (23, 'A', 'C', 'C') 
GO 

-- Do row-by-row processing to get the desired results 
SET NOCOUNT ON 
DECLARE @TableA_ID int 
DECLARE @TableB_Identity int 
DECLARE @ColumnX varchar(100) 

SET @TableA_ID = 0 

WHILE 1=1 BEGIN 

    -- Get the next row to process 
    SELECT TOP 1 
    @TableA_ID=ID, 
    @ColumnX = ColumnA + ColumnB + ColumnC 
    FROM TableA 
    WHERE ID > @TableA_ID 

    -- Check if we are all done 
    IF @@ROWCOUNT = 0 
    BREAK 

    -- Insert row into TableB 
    INSERT INTO TableB (ColumnX) 
    SELECT @ColumnX 

    -- Get the identity of the new row 
    SET @TableB_Identity = SCOPE_IDENTITY() 

    -- At this point, you have @TableA_ID and @TableB_Identity. 
    -- Go to town with whatever extra processing you need to do 
    INSERT INTO TableC (TableA_ID, TableB_ID) 
    SELECT @TableA_ID, @TableB_Identity 

END 
GO 

SELECT * FROM TableC 
GO 

SELECT * FROM TableA

ID   ColumnA ColumnB ColumnC 
----------- ---------- ---------- ---------- 
1   A   A   A 
2   A   A   B 
3   A   A   C 
11   A   B   A 
12   A   B   B 
13   A   B   C 
21   A   C   A 
22   A   C   B 
23   A   C   C 

SELECT * FROM TableB

Identity ColumnX 
----------- ------------------------------ 
1   AAA 
2   AAB 
3   AAC 
4   ABA 
5   ABB 
6   ABC 
7   ACA 
8   ACB 
9   ACC 

SELECT * FROM TableC

TableA_ID TableB_ID 
----------- ----------- 
1   1 
2   2 
3   3 
11   4 
12   5 
13   6 
21   7 
22   8 
23   9 
+0

merci, cela fonctionne pour moi :) –

0

En supposant: TableB existe

INSERT INTO TableB (ColumnX) 
SELECT [TableA]![ColumnA]+","+[TableA]![ColumnB]+","+[TableA]![ColumnC] AS ColumnX 
FROM TableA; 
+0

TableB ne peut pas stocker TableA.ID –

+0

Vous pouvez ajouter TableA.ID dans le cadre de l'agrégat, par exemple à la fin de TableB.Columnx et utiliser la fonction Right pour supprimer la valeur de la fin de la chaîne ... – Fender

Questions connexes