Comment avez-vous concat plusieurs lignes dans une colonne dans SQL Server?
J'ai cherché haut et bas pour la réponse, mais je ne peux pas le comprendre. Je suis relativement nouveau à SQL Server et ne pas tout avoir la syntaxe vers le bas encore. J'ai cette discbased (simplifié):
Table "Utilisateurs" | Tableau "Tags": Nom D'Utilisateur Nom D'Utilisateur | TagID UserID PhotoID 1 Bob | 1 1 1 2 projet de Loi | 2 2 1 3 Jane | 3 3 1 4 | Sam 4 2 2 ----------------------------------------------------- Tableau "Photos": | Table "Albums": PhotoID UserID AlbumID | AlbumID UserID 1 1 1 | 1 1 2 1 1 | 2 3 3 1 1 | 3 2 4 3 2 | 5 3 2 |
Je suis à la recherche d'un moyen d'obtenir toutes les infos sur la photo (facile), plus tous les tags pour cette photo concaténés comme CONCAT(username, ', ') AS Tags
bien sûr, avec la dernière virgule supprimé. Je vais avoir un ours d'un temps à essayer de le faire. J'ai essayé la méthode de la cet article mais j'obtiens une erreur lorsque j'essaie d'exécuter la requête en disant que je ne peux pas utiliser DECLARE
états... avez-vous une idée de comment cela peut être fait? Je suis en utilisant VS08 et quelle que soit la base de données est installée dans elle (j'ai l'habitude d'utiliser MySQL donc je ne sais pas ce que la saveur de la DB c'est vraiment... c'est une .fichier mdf?)
OriginalL'auteur Jason | 2009-08-09
Vous devez vous connecter pour publier un commentaire.
Je voudrais créer un fichier UDF:
Ensuite, tout ce que vous avez à faire est de:
Scalaire Évalués -- désolé, je n'ai pas préciser.
L'élaboration d'un bit: Table et les fonctions inline à la fois le type de retour de la table. Ces options sont à vous aider avec certains de la syntaxe, mais si vous avez exécuté cette SQL directement, il serait automatiquement scalaire.
merci beaucoup... avec un peu de modification, j'ai eu que cela fonctionne! maintenant, comme un bonus, comment puis-je supprimer la virgule (, j'ai changé l'ordre autour de un peu, de sorte que le nom d'utilisateur va d'abord, puis @mytags, sinon il y a un leader de la virgule)?
Désolé, j'ai oublié le
substring
quand je généralisée de la fonction. J'avais testé sur ma machine en premier. Cela permettra d'éliminer le leader de la virgule (plus rapide que la suppression d'une fuite).OriginalL'auteur Eric
Ok, je sens que j'ai besoin de sauter dans le commentaire à propos de Comment avez-vous concat plusieurs lignes dans une colonne dans SQL Server? et de fournir un plus préféré réponse.
Je suis vraiment désolé, mais en utilisant les fonctions scalaires comme cela tuera les performances. Il suffit d'ouvrir le générateur de profils SQL et avoir un regard sur ce qui se passe lorsque vous utilisez un scalaire en fonction qui s'appelle un tableau.
Aussi, la "mise à jour d'une variable" technique pour la concaténation n'est pas encouragé, car cette fonctionnalité pourrait ne pas continuer dans de futures versions.
La façon de travailler de concaténation de chaîne à utiliser POUR XML CHEMIN d'accès au lieu.
Pour des exemples de la façon dont POUR XML PATH œuvres, considérez les points suivants, en imaginant que vous avez une table avec deux champs 'id' et 'nom'
Donne:
Mais si vous laissez le mal à la RACINE, vous obtenez quelque chose de légèrement différent:
Et si vous mettez un vide de chaîne de CHEMIN, de vous rapprocher encore davantage à l'ordinaire de concaténation de chaîne:
Maintenant vient le vraiment difficile... Si vous avez le nom d'une colonne en commençant par un signe@, il devient un attribut, et si une colonne n'a pas de nom (ou de vous appeler [*]), puis on laisse de côté cette balise en trop:
Enfin, maintenant, pour dépouiller le leader de la virgule, les TRUCS de commande. TRUC(s,x,n,s2) extrait n caractères de s, en commençant à la position x. À leur place, il met s2. Donc:
SÉLECTIONNEZ TRUCS('abcde',2,3,'123456');
donne:
a123456e
Alors maintenant, jetez un oeil à ma requête ci-dessus pour votre taglist.
Pour chaque photo, j'ai une sous-requête qui attrape les balises et les concatène (dans l'ordre) avec une commma et un espace. Ensuite, j'ai surround qui sous-requête dans un des trucs de commande pour dépouiller le leader de la virgule et un espace.
Je m'excuse pour toutes les fautes d'orthographe - je n'ai pas vraiment créé les tables sur ma machine de test.
Rob
SELECT ',' + username
àSELECT TOP (100) PERCENT ', ' + dbo.users.username AS tags
...Se débarrasser des "balises". Et ne pas le mettre dans une fonction. Exécuter en tant que. Qu'avez-vous fait courir?
je ne peux pas vous débarrasser de l' "que" parce qu'elle met "en tant que Expr1" comme un défaut, et je n'ai pas l'exécuter comme une fonction. j'ai couru comme une requête SQL standard :\
On dirait que vous êtes soit à l'aide de l'Accès ou de la "Conception de la Requête dans l'Éditeur de fonction". Mettre la requête dans un Nouvelle fenêtre de Requête dans la Gestion de Studio et de l'exécuter. Vous avez certainement N'avez PAS besoin de l' "comme Expr1", ou le "HAUT (100) pour CENT". Se débarrasser d'eux à la fois.
trouvé dans une recherche et il m'a aidé énormément. super réponse!
OriginalL'auteur Rob Farley