9
votes

Comment diviser une chaîne dans T-SQL?

J'ai un varchar @ A = 'A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P' , qui a | valeurs délimitées. Je veux diviser cette variable dans une matrice ou une table.

Comment puis-je faire cela?


4 Réponses :


13
votes

Utilisez une fonction de valorisation de table comme celle-ci, xxx

et obtenir votre variable et utilisez cette fonction comme celle-ci, xxx


4 commentaires

@gbn fait la table des nombres exécutant plus vite qu'une boucle .... S'il vous plaît expliquer un peu plus ...


S'il vous plaît voir mes liens dans ma réponse


Il existe des solutions plus élégantes, mais lors de la prise en charge des bases de code héritées de SQL 2005 et ci-dessous, c'est le seul choix.


Si vous nettoyez la table TEMP qui est renvoyée de la fonction?



2
votes

En général, il s'agit là d'une question commune ici

Je vais donner la réponse commune: Les tableaux et listes de SQL Server 2005 et au-delà par Erland Sommmarskog

Je recommanderais un Table des numéros , Pas une boucle, pour une utilisation générale.


1 commentaires

Vous pourriez peut-être améliorer la réponse en expliquant comment appliquer cette méthode pour diviser un texte à chaque délimiteur. =)



2
votes

Essayez celui-ci:

declare @a varchar(10) 
set @a = 'a|b|c|'
while len(@a) > 1
begin
insert into #temp
select substring(@a,1,patindex('%|%',@a)-1);
set @a = substring(@a,patindex('%|%',@a)+1,len(@a))
end;


2 commentaires

Belle solution, mais doit clarifier - il est important que la chaîne soit terminée par un symbole délimiteur. Si ce ne sera pas - vous tomberez dans un cycle infini


Mon extension à votre solution consiste à ajouter cette clause après votre "Set @a" Row: Si (Patindex ('% |%', @ a) = 0) commencez à insérer dans #Temp sélectionnez @a; PAUSE; FINIR;



1
votes

Voici une solution basée sur XML alternative. Il semble avoir une performance similaire comme la solution SplitFN ().

Ceci convertit Varchar A | B | C | D | E | F | G | H | I | J | K | L | M | N | o | p dans xml a b c d e < / a> f g H i j k l m n o p et extrait la valeur de Chaque xml nœud. xxx


0 commentaires