SQL 2005 Split Séparées par des Virgules Colonne sur Délimiteur

Mes recherches google sur comment scinder une chaîne sur un délimiteur ont donné lieu à certaines fonctions utiles pour le fractionnement des chaînes lorsque la chaîne est connue (c'est à dire voir ci-dessous):

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Split] (@String varchar(8000), @Delimiter char(1))     
   returns @temptable TABLE (items varchar(8000))       
   as       
   begin       
       declare @idx int       
        declare @slice varchar(8000)       

        select @idx = 1       
            if len(@String)<1 or @String is null  return       

       while @idx!= 0       
       begin       
           set @idx = charindex(@Delimiter,@String)       
           if @idx!=0       
               set @slice = left(@String,@idx - 1)       
           else       
              set @slice = @String       

           if(len(@slice)>0)  
               insert into @temptable(Items) values(@slice)       

           set @String = right(@String,len(@String) - @idx)       
           if len(@String) = 0 break       
       end   
   return       
   end  

Cela fonctionne bien pour une chaîne connue comme:

SELECT TOP 10 * FROM dbo.Split('This,Is,My,List',',')

Cependant, je tiens à passer d'une colonne à une fonction, et il a fusionné avec mes autres données en sa propre ligne... par exemple les données:

CommaColumn   ValueColumn1   ValueColumn2
-----------   ------------   -------------
ABC,123       1              2
XYZ, 789      2              3

Je voudrais écrire quelque chose comme:

SELECT Split(CommaColumn,',') As SplitValue, ValueColumn1, ValueColumn2 FROM MyTable

Et de revenir

SplitValue    ValueColumn1   ValueColumn2
----------    ------------   ------------
ABC           1              2
123           1              2
XYZ           2              3
789           2              3

Est-ce possible, ou quelqu'un a fait cela avant?

  • 99% du temps ou plus de séparation par virgule colonnes sont le résultat d'une mauvaise conception de base de données en premier lieu. Le seul endroit pour une fonction de répartition au niveau du serveur est refactoring ces colonnes dans leur propre table.
  • J'espère que ce tableau est de vous mise en scène de la base de données et contient des données brutes à partir d'un système exclusif où vous n'avez aucun moyen de changer la disposition de table?
InformationsquelleAutor Kyle Ballard | 2009-06-04