Comment puis-je Diviser une Chaîne Délimitée dans SQL Server Sans la Création d'une Fonction?
Je travaille avec une base de données SQL Server. J'ai une colonne qui contient une liste délimitée par des virgules, et j'ai besoin d'écrire une requête qui fend les valeurs de la liste en lignes. À partir de la navigation sur StackOverflow et le reste du web, je sais que c'est un problème commun. En fait, j'ai trouvé une analyse approfondie ici:
http://www.sommarskog.se/arrays-in-sql.html
Malheureusement, toutes les solutions que j'ai vu sur ce site et ailleurs, me demande de créer une fonction. Ce n'est pas une option pour moi, je manque les privilèges requis pour utiliser la commande CRÉER.
Sans CRÉER, je sais que je peux utiliser le PARSENAME fonction, quelque chose comme cela (Merci à Nathan Bedford à Comment puis-je diviser une chaîne afin que je puisse accéder à l'élément de x?.):
SELECT PARSENAME(REPLACE('Hello John Smith', ' ', '.'), 2)
Cependant, PARSENAME fonctionne uniquement pour les listes de 4 points ou moins. Ma question est donc la suivante: Comment dois-je écrire une requête pour diviser une chaîne délimitée de plus de 4 éléments sans créer de nouveaux objets dans la base de données?
EDIT:
Merci à tous pour les réponses rapides. J'ai peut-être laissé de côté certaines informations importantes, je suis en interaction avec la base de données via une connexion ODBC. En plus de CRÉER des états, il semble y avoir d'autres déclarations qui ne fonctionnent pas. Par exemple, je n'arrive pas à utiliser DÉCLARER, dans une déclaration à définir une variable qui sera utilisée dans une autre déclaration. Aussi loin que je peux comprendre, je dois tout mettre dans une seule instruction SELECT (bien qu'AVEC semble également fonctionner pour la déclaration commune des tables). Malheureusement, toutes les solutions proposées à ce jour semblent exiger des déclarations de variable à l'extérieur de l'instruction SELECT, et qui ne fonctionne pas. S'il vous plaît garder avec moi-je suis en train d'apprendre que je vais.
OriginalL'auteur Todd | 2011-04-19
Vous devez vous connecter pour publier un commentaire.
Une version à l'aide de XML.
À l'aide d'une table au lieu
Remplacer
@T
avec ce que jamais la table où vous êtes en utilisant.Le fractionnement de la chaîne de
'Hello John Smith'
sans l'aide d'une variablePourrait être amélioré par le casting pas dans la requête et de l'utilisation d'une variable xml à la place. Ne sera pas aussi rapide que d'utiliser un numberstable. SQL Violon
Je ne suis pas bon à cela, vous serais reconnaissant si vous montrer comment le faire sans casting?
Il suffit de suivre le lien vers SQL Violon dans mon dernier commentaire.
Pourriez-vous svp mettre à jour SQL violon lien si disponible. Si non, jamais l'esprit, merci pour la réponse quand même
OriginalL'auteur Mikael Eriksson
exemple en utilisant le construit en maître..spt_values table
Voir ici pour plus d': Découper Une Chaîne En Utilisant Un Numéro De Table
OriginalL'auteur SQLMenace
Vous pouvez utiliser l'expression de table commune récursive progressivement à extraire un élément
Exemple de table
La requête
Notes:
' .'
est nécessaire parce que SQL Server n'a normalement pas voir les espaces à droite comme significative.a
etb
conservés dans la sortie, avec la colonnec
divisé ensingle
et une colonne supplémentaire pour indiquer la position.OriginalL'auteur RichardTheKiwi
Pour les retardataires à cette question, l'article à http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings fournit une excellente analyse de performance pour les différentes options. Certaines de ces options comprennent (copié à partir du site de référence):
CLR
.Net code à http://dataeducation.com/sqlclr-string-splitting-part-2-even-faster-even-more-scalable/.
XML
CTE
Fonction
Il s'avère, la meilleure performance est obtenue à l'aide de la fonction CLR tandis que le XML solution fait aussi bien. Dans presque tous les cas, à l'aide d'un tableau de nombres (l'approche n'est pas dupliqué ci-dessus) conduire à la pire performance.
OriginalL'auteur erdomke
Pour sql Server >= 2016 vous pouvez utiliser string_split comme ci-dessous:
Sortie
OriginalL'auteur Kannan Kandasamy
Avez-vous regardé le tableau de nombres?
http://www.sqlservercentral.com/articles/T-SQL/62867/
http://bradsruminations.blogspot.com/2010/08/integer-list-splitting-sql-fable.html
OriginalL'auteur Sankar Reddy
Je voudrais juste prendre l'une des nombreuses fonctions qui crée une table et au lieu de retourner la valeur de la mettre dans une variable de table. Ensuite, utilisez la variable de table. Voici un exemple qui renvoie un tableau.
http://www.codeproject.com/KB/database/SQL_UDF_to_Parse_a_String.aspx
OriginalL'auteur Hogan
à l'aide d'une UDF qui fait le plus de sens, elle est flexible pour tous les projets, celui que j'utilise généralement est à mon blog,
http://sqlthis.blogspot.com/2005/02/list-to-table.html
parce que c'est écrit pour prendre votre chaîne d'entrée et un séparateur, il peut être n'importe quel caractère unique pour un délimiteur. J'ai écrit le lien ci-dessus, mais ensuite j'ai trouvé de nombreux sites de publication d'une solution similaire, afin que les parties peuvent avoir été inspirés de forums que je suis un membre de...
il fonctionne, et j'espère qu'il va travailler pour vous aussi.
modifier 2017-08-09 comme suggéré, j'ai cloné le bloc de code ci-dessous. merci!
OriginalL'auteur SeeCoolGuy
OriginalL'auteur Vikram Singh
-- LAISSEZ-MOI SAVOIR SI VOUS AVEZ DES DOUTES COMPRENDRE LE CODE
OriginalL'auteur URMIL PREMAL SHAH
Voici un définis par l'utilisateur fonction d'analyse syntaxique qui permet à SQL Server qui effectue également de même pour le VB "Split" de la fonction. Conçu pour interactive de l'effet de levier par exemple, pour analyser des données à l'intérieur d'une Procédure Stockée appelée à partir d'une API externe.
https://gallery.technet.microsoft.com/scriptcenter/User-def-function-enabling-98561cce
OriginalL'auteur Big D