Je cherche à diviser '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ...' (délimité par des virgules) en une table ou une variable de table .
Quelqu'un a-t-il une fonction qui renvoie chacun dans une rangée?
sql
sql-server
tsql
sql-server-2008
jinsungy
la source
la source
Réponses:
Voici une solution quelque peu démodée:
Dans SQL Server 2008, vous pouvez réaliser la même chose avec du code .NET. Peut-être que cela fonctionnerait plus rapidement, mais cette approche est certainement plus facile à gérer.
la source
Essaye ça
OU
De nombreuses autres façons de faire la même chose sont ici Comment diviser une chaîne délimitée par des virgules?
la source
<
,>
ou&
(par exemple, l'entrée est une séquence d'entiers). N'importe lequel des trois caractères ci-dessus entraînera une erreur d'analyse au lieu du résultat attendu.SELECT b, CHARINDEX(@delimiter, @str, b) + LEN(@delimiter)
devrait en fait êtreSELECT b, CHARINDEX(@delimiter, @str, b+1) + LEN(@delimiter)
. Le b + 1 fait une grande différence. Testé ici avec un espace comme délimiteur, n'a pas fonctionné sans ce correctif.MAXRECURSION
option pour diviser plus de 100 pièces, remplacerLEN
par quelque chose de stackoverflow.com/q/2025585 pour gérer les espaces et exclure lesNULL
lignes pour lesNULL
entrées.Vous avez marqué ce SQL Server 2008, mais les futurs visiteurs de cette question (utilisant SQL Server 2016+) voudront probablement en savoir plus
STRING_SPLIT
.Avec cette nouvelle fonction intégrée, vous pouvez maintenant simplement utiliser
Certaines restrictions de cette fonction et certains résultats prometteurs des tests de performances sont dans ce billet de blog par Aaron Bertrand .
la source
Cela ressemble plus à .NET, pour ceux d'entre vous qui connaissent cette fonction:
la source
voici la fonction split que tu as demandé
exécutez la fonction comme ceci
la source
Source de cette réponse: http://sqlhint.com/sqlserver/how-to/best-split-function-tsql-delimited
la source
Je suis tenté de me glisser dans ma solution préférée. La table résultante sera composée de 2 colonnes: PosIdx pour la position de l'entier trouvé; et Valeur en entier.
Il fonctionne en utilisant le CTE récursif comme liste de positions, de 1 à 100 par défaut. Si vous devez travailler avec une chaîne supérieure à 100, appelez simplement cette fonction en utilisant 'option (maxrecursion 4000)' comme suit:
la source
usage
la source
Ce CTE simple donnera ce qu'il faut:
la source
Ceci est une autre version qui n'a vraiment aucune restriction (par exemple: caractères spéciaux lors de l'utilisation de l'approche xml, nombre d'enregistrements dans l'approche CTE) et elle s'exécute beaucoup plus rapidement sur la base d'un test sur plus de 10 millions d'enregistrements avec une longueur moyenne de chaîne source de 4000. J'espère que cela pourrait aider.
la source
En utilisant la table de pointage, voici une fonction de chaîne fractionnée (meilleure approche possible) par Jeff Moden
Référé de Tally OH! Une fonction améliorée de «séparateur CSV» SQL 8K
la source
Ce blog est venu avec une assez bonne solution utilisant XML dans T-SQL.
C'est la fonction que j'ai créée sur la base de ce blog (changer le nom de la fonction et le type de résultat en fonction des besoins):
la source
la source
la source
Vous écrivez cette fonction dans le serveur sql après que ce problème soit résolu.
http://csharpdotnetsol.blogspot.in/2013/12/csv-function-in-sql-server-for-divide.html
la source