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?
Vous devez vous connecter pour publier un commentaire.
Oui, c'est possible avec la CROIX APPLIQUER SQL (2005+):
Notes:
Vous devez ajouter un index de l'ensemble de résultats de votre double colonne, de sorte qu'elle retourne deux colonnes, IndexNumber et de la Valeur.
En ligne mises en oeuvre avec une table de nombres sont généralement plus rapides que votre version procédurale ici.
par exemple:
Erland Sommarskog a définitivement la page sur ce, je pense: http://www.sommarskog.se/arrays-in-sql-2005.html
Résoudre le problème de la bonne façon--faire de cette colonne d'une table liée. Rien de bon ne vient jamais de comma-separated scalaire colonnes.
+1 pour l'anti-CSV commentaires, mais si vous devez faire cela, vous devez utiliser la CROIX APPLIQUER ou à l'EXTÉRIEUR de l'APPLIQUER.
Utilisation:
Vous pouvez essayer quelque chose comme: