2010-02-03 4 views
1

J'utilise SQL Server 2005.Comment séparer la valeur de chaîne et de créer temporaire pour stocker la chaîne séparée dans la table temporaire

J'ai créé une table avec les colonnes ID et Courses. Les dossiers sont les suivants:

ID             Cours
1.             Java, ASP.Net, C#
2.             Java
          Java, C#
4.             html

La colonne Courses est de type varchar et les valeurs qu'il contient sont séparés par des virgules. Je veux séparer chaque mot et le stocker dans un autre ou temp. table.

sortie doit être comme ceci:

ID             Cours
1.             Java
2.             ASP.Net
3.             C#
4.             html

Ici ID est pas important.

Merci.

Répondre

3

voir my previous answer to this

c'est la meilleure source:

http://www.sommarskog.se/arrays-in-sql.html

créer une fonction split, et l'utiliser comme:

SELECT 
    * 
    FROM YourTable y 
    INNER JOIN dbo.splitFunction(@Parameter) s ON y.ID=s.Value 

I prefer the number table approach

Pour cette méthode au travail, vous devez faire une configuration horaire:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number 
    INTO Numbers 
    FROM sys.objects s1 
    CROSS JOIN sys.objects s2 
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number) 

Une fois la table des numéros est mis en place, créez cette fonction:

CREATE FUNCTION [dbo].[FN_ListToTable] 
(
    @SplitOn char(1)  --REQUIRED, the character to split the @List string on 
    ,@List  varchar(8000)--REQUIRED, the list to split apart 
) 
RETURNS TABLE 
AS 
RETURN 
(

    ---------------- 
    --SINGLE QUERY-- --this will not return empty rows 
    ---------------- 
    SELECT 
     ListValue 
     FROM (SELECT 
        LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue 
        FROM (
          SELECT @SplitOn + @List + @SplitOn AS List2 
         ) AS dt 
         INNER JOIN Numbers n ON n.Number < LEN(dt.List2) 
        WHERE SUBSTRING(List2, number, 1) = @SplitOn 
      ) dt2 
     WHERE ListValue IS NOT NULL AND ListValue!='' 

); 
GO 

Vous pouvez maintenant facilement diviser une chaîne CSV dans une table et rejoindre là-dessus:

select * from dbo.FN_ListToTable(',','1,2,3,,,4,5,6777,,,') 

SORTIE:

ListValue 
----------------------- 
1 
2 
3 
4 
5 
6777 

(6 row(s) affected) 

Pour faire ce que vous avez besoin de travail, l'utilisation CROSS APPLY:

DECLARE @tbl_A table (RowID int, RowValue varchar(500)) 
DECLARE @tbl_b table (RowID int identity, RowValue varchar(500)) 

INSERT INTO @tbl_A VALUES (1, 'Java, ASP.Net, C#') 
INSERT INTO @tbl_A VALUES (2, 'Java') 
INSERT INTO @tbl_A VALUES (3, 'Java, C#') 
INSERT INTO @tbl_A VALUES (4, 'html') 

INSERT INTO @tbl_b (RowValue) 
SELECT DISTINCT 
    st.ListValue 
    FROM @tbl_A 
     CROSS APPLY dbo.FN_ListToTable(',',RowValue) AS st 
    ORDER BY st.ListValue 

SELECT * FROM @tbl_b ORDER BY RowID 

SORTIE:

RowID  RowValue 
----------- -------------- 
1   ASP.Net 
2   C# 
3   html 
4   Java 

(4 row(s) affected) 
+0

Merci beaucoup. Vous me donnez une solution parfaite. – Kamlesh

Questions connexes