2010-08-13 39 views
1

I ont deux tables qui contiennent tous les deux 'conduites séparées valeurs'fusionner deux champs en un seul avec seulement de nouveaux articles

par exemple:

Tableau 1:

DataField_A 

item 1|item 2|item 3|etc..... 

Tableau 2:

DataField_A 

item 7|item 5|item 3|etc..... 

Je dois fusionner le tableau 2 dans le tableau 1 de telle sorte que le tableau 2 contienne tous les éléments des deux tables.

Faire ce pro-grammaticalement serait une simple question de boucle à travers chaque élément dans le tableau 2 et en ajoutant à la table 1 si elle n'existe pas dans le tableau 1.

Comment cela peut-il être fait dans SQL comme stocké procédure?

+0

Comment ajouter à votre table une erreur liée à ce tableau? –

+0

@OMG oui c'est correct. @Michael, les tables ont tous deux linkId qui les relie, par exemple Table 1 a LinkId, table 2 a aussi LinkId – Darknight

+0

Ceci est pour SQL Server 2005? J'ai relu votre question - vous avez dénormalisé des données, et vous voulez fusionner * plus * de données dénormalisées dans une seule table? Ugh ... –

Répondre

1

J'ai utilisé une fonction d'analyse (l'exemple que j'utilise vient de here) pour analyser la chaîne dans Table1. Ensuite, j'utilise cette fonction dans un CTE pour trouver des éléments manquants dans Table2 et fusionner les données.

/* Helper function to parse delimited string */ 
CREATE FUNCTION [dbo].[fnParseStringTSQL] (@string NVARCHAR(MAX),@separator NCHAR(1)) 
RETURNS @parsedString TABLE (string NVARCHAR(MAX)) 
AS 
BEGIN 
    DECLARE @position int 
    SET @position = 1 
    SET @string = @string + @separator 
    WHILE charindex(@separator,@string,@position) <> 0 
     BEGIN 
     INSERT into @parsedString 
     SELECT substring(@string, @position, charindex(@separator,@string,@position) - @position) 
     SET @position = charindex(@separator,@string,@position) + 1 
     END 
    RETURN 
END 
go 

/* Set up some sample data */ 
declare @Table1 table (
    id int, 
    DataField_1A varchar(500) 
) 

declare @Table2 table (
    id int, 
    DataField_2A varchar(500) 
) 

insert into @Table1 
    (id, DataField_1A) 
    select 1, 'item 1|item 2|item 3' 
    union 
    select 2, 'item A|item B|item C|item D|item Z' 

insert into @Table2 
    (id, DataField_2A) 
    select 1, 'item 7|item 5|item 3' 
    union 
    select 2, 'item A|item Y|item Z' 

/* data before the update */ 
select * from @Table2 

/* boolean to ensure loop executes at least once */ 
declare @FirstLoop bit 
set @FirstLoop = 1 

/* Do the updates */ 
while (@FirstLoop = 1 or @@ROWCOUNT <> 0) begin 
    set @FirstLoop = 0 

    ;with cteMissingItems as (
    select t2.id, p.string 
     from @Table2 t2 
      inner join @Table1 t1 
       on t2.id = t1.id 
      cross apply dbo.fnParseStringTSQL(t1.DataField_1A,'|') p 
     where charindex(p.string, t2.DataField_2A) = 0 
    ) 
    update t2 
     set t2.DataField_2A = t2.DataField_2A + '|' + mi.string 
     from @Table2 t2 
      inner join cteMissingItems mi 
       on t2.id = mi.id 
end /* while */ 

/* Prove the update worked */ 
select * from @Table2 

/* Clean up */ 
drop function dbo.fnParseStringTSQL 
+0

Excellent! Je veux bien essayer. Si cela fonctionne, je le marquerai comme la solution acceptée. Merci beaucoup! – Darknight