2010-11-24 3 views
6

Je vous écris un curseur pour remplir les données dans une nouvelle table à partir de la table principale qui contient des données de manière ci-dessousComment diviser chaîne et enregistrer dans un tableau en T-SQL

article     Couleurs
Shirt     Rouge, Bleu, vert, Jaune

Je veux remplir les nouvelles données de la table en allant chercher l'élément, puis l'ajouter dans la ligne, en fonction de chaque couleur qu'il contient

article     Couleur
shirt     rouge
shirt     bleu
shirt     vert
shirt     jaune

Je suis coincé dans la façon de

1) Delimate/de Split "Couleurs" string 2) Pour l'enregistrer dans un tableau 3) Pour l'utiliser dans le curseur

comme je vais utiliser le curseur imbriqué à cet effet.

Répondre

4

En utilisant Sql Server 2005+ et le type de données XML, vous pouvez jeter un oeil à la

DECLARE @Table TABLE(
     Item VARCHAR(250), 
     Colors VARCHAR(250) 
) 

INSERT INTO @Table SELECT 'Shirt','Red,Blue,Green,Yellow' 
INSERT INTO @Table SELECT 'Pants','Black,White' 


;WITH Vals AS (
     SELECT Item, 
       CAST('<d>' + REPLACE(Colors, ',', '</d><d>') + '</d>' AS XML) XmlColumn 
     FROM @Table 
) 
SELECT Vals.Item, 
     C.value('.','varchar(max)') ColumnValue 
FROM Vals 
CROSS APPLY Vals.XmlColumn.nodes('/d') AS T(C) 
2

L'article Faking Arrays in Transact SQL détails ci-dessous de plusieurs techniques, notamment pour résoudre ce problème, allant de l'utilisation de la fonction ParseName() (limite à 5 items) à l'écriture de fonctions CLR.

La réponse XML est l'une des techniques détaillées pouvant être choisies pour un scénario spécifique.

La combinaison de quelques-uns des conseils, je résolu mon problème diviser la chaîne comme ceci:

SET NOCOUNT ON; 

DECLARE @p NVARCHAR(1000), @len INT; 
SET @p = N'value 1,value 2,value 3,value 4,etc'; 
SET @p = ',' + @p + ','; 
SET @len = LEN(@p); 

-- Remove this table variable creation if you have a permanent enumeration table 
DECLARE @nums TABLE (n int); 
INSERT INTO @nums (n) 
    SELECT A.n FROM 
    (SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY TableKey) as n FROM dbo.Table) A 
    WHERE A.n BETWEEN 1 AND @len; 

SELECT SUBSTRING(@p , n + 1, CHARINDEX(',', @p, n + 1) - n - 1) AS "value" 
    FROM @nums 
    WHERE SUBSTRING(@p, n, 1) = ',' AND n < @len; 

Notez que, compte tenu de 1000 votre limite de longueur de chaîne, vous devez avoir une table avec 1000 lignes ou plus (dbo.Table sur l'exemple tsql) pour créer la variable de table @nums de cet exemple. Sur l'article, ils ont une table d'énumération permanente.

0

Je viens d'accomplir quelque chose comme ceci pour créer des tables de transfert pour répliquer les tables source en utilisant les vues INFORMATION_SCHEMA sur un serveur lié. Mais ceci est une version modifiée pour créer les résultats que vous recherchez. N'oubliez pas de supprimer les deux derniers caractères de la colonne Couleurs lorsque vous l'affichez.

SELECT 
    t.Item 
    , (
     SELECT 
      x.Color + ', ' AS [data()] 
     FROM 
      Items x 
     WHERE 
      x.Item = t.Item 
     FOR XML PATH(''), TYPE 
    ).value('.', 'varchar(max)') AS Colors 
FROM 
    Items t 
GROUP BY 
    t.Item 
Questions connexes