2010-12-10 28 views
2

J'utilise une sous-requête pour obtenir les résultats nécessaires (plusieurs enregistrements retournés), et je veux mettre ces résultats dans un seul enregistrement retourné. Lorsque j'exécute la sous-requête elle-même, cela fonctionne, mais une fois que je l'utilise comme sous-requête, cela ne fonctionne plus en raison d'une erreur de syntaxe.T-SQL, Select @variable dans une sous-requête provoque une erreur de syntaxe

Le code suivant provoque une erreur de syntaxe

(syntaxe incorrecte près '='.)

declare @test varchar(1000) 
set @test = '' 

SELECT description, (SELECT @test = @test + FirstName 
       FROM EMP_tblEmployee 
       )select @test 
FROM EMP_tblCrew 

Donc, essentiellement, la sous requête

(SELECT @test = @test + FirstName 
        FROM EMP_tblEmployee 
        )select @test 

retours " charliejohnjacob "

La principale requête

SELECT description FROM EMP_tblCrew 

retours "concierge"

Je veux dire

janitor | charliejohnjacob

2 champs, 1 enregistrement.

+2

Que voulez-vous faire en anglais? –

+0

Essayez-vous de transformer des lignes en colonnes, ou ajoutez un espace à firstName – StingyJack

+0

Ressemble à une tentative de concaténation de tous les prénoms dans un jeu de résultats ... mais pourquoi? Cela, si cela fonctionne, va créer une sorte de pyramide de noms. L'intention ici est très discutable. –

Répondre

1

Votre requête n'est pas syntaxiquement correcte et l'analyseur T-SQL a la fâcheuse habitude de ne pas rapporter une erreur de manière assez précise. Ceci est un peu un coup de poignard dans l'obscurité, mais essayez:

SELECT 
description, 
(SELECT FirstName + ' ' FROM EMP_tblEmployee FOR XML PATH('')) AS [Name Concat Result] 
FROM EMP_tblCrew 

Cela va fixer au moins une chose, mais je ne sais pas comment le serveur SQL se sent sur concaténer en ligne comme ça. Vous risquez également de déborder le varchar (1000) si votre table est de taille appréciable. Même varchar 8000 n'est pas beaucoup pour ce genre de requête.

+0

Salut, je viens d'essayer, ne fonctionne pas, même erreur. déclare @test varchar (1000) ensemble @test = '' \t Description SELECT (SELECT @test = @test + FirstName \t \t \t \t DE EMP_tblEmployee \t \t \t \t) que les tests de EMP_tblCrew – Kukoy

+0

Si vous voulez vraiment concaténer les noms que vous pourriez penser en utilisant un curseur ou une fonction CTE. S'il vous plaît expliquer ce que vous voulez accomplir. Mieux encore, mock up un ensemble de résultats de ce que vous voulez. –

+0

Il vous manque la clause FROM dans la requête de votre commentaire. –

1

Essayez de rechercher "SQL Concatenate rows into string". Il existe un certain nombre de solutions utiles pour cela.

Il semble que vous ayez également besoin de joindre l'employé à la table des équipages, de sorte que vous n'obteniez pas de produit cartésien (ce qui n'est généralement pas ce que vous recherchez).

+0

C'est embarrassant, j'ai trouvé quelques questions similaires à la mienne en utilisant vos critères de recherche ... Merci pour la contribution. http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string http://stackoverflow.com/questions/6899/-there-a-way-to -create-a-mssql-function-to-join-plusieurs-rows-from-a-subquery – Kukoy

0

Probablement le chemin le plus simple implique l'utilisation d'un CTE récursif (expression de table commune). Un exemple détaillé de qui est à https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

Remarque, cela nécessite essentiellement que vous avez sql 2008.

Une autre voie serait de créer une fonction définie par l'utilisateur qui a renvoyé les valeurs concaténées de la table EMP_tblEmployee. Vous pourriez le faire en 2005 ou 2008.