2009-07-24 6 views
0

Je souhaite créer une fonction qui renvoie une chaîne concaténée d'un champ donné d'une requête donnée. Voici ce que j'ai fait. Et celui-ci me donne une erreur. Doit déclarer la variable de table "@qry".Champ Concat SQL à partir de plusieurs lignes

CREATE FUNCTION dbo.testing 
    ( 
    @qry varchar(1000), 
    @fld varchar(100), 
    @separator varchar(15) = '; ' 
    ) 
RETURNS varchar 
AS 
    BEGIN 
    DECLARE @rslt varchar(1000) 
    SET @rslt ='' 

    SELECT @rslt = @rslt + @separator + CAST(@fld as varchar(160)) FROM @qry 

    RETURN @rslt 
    END 

Ce que je suis en train de faire est de passer une requête à cette fonction et recevoir une chaîne concatinated pour certains champs de la requête.

Est-ce possible?

Qu'est-ce que je fais mal?

EDIT: BTW J'ai MSSQL Server 2005;

+2

le faire comme: ** Set @ rslt = NULL; SELECT ISNULL (@ rslt + @ separator, '') + ... ** donc vous n'obtenez pas de @separator au début du @rslt –

Répondre

2

Vous ne pouvez pas faire un FROM @variable. Vous devez utiliser SQL dynamique et faire de votre @qry une table dérivée ou quelque chose de cette nature. Cependant, je pense que ce n'est vraiment pas la meilleure approche. Je crois que c'est ce que vous essayez de faire:

http://geekswithblogs.net/mnf/archive/2007/10/02/t-sql-user-defined-function-to-concatenate-column-to-csv-string.aspx

Assurez-vous de lire aussi bien les commentaires sur la solution alternative XML.

3

Si vous souhaitez passer par n'importe quel type de SQL dynamique, vous devez l'exécuter via EXEC ou (de préférence) sp_ExecuteSQL. Assurez-vous que votre code n'est pas sujet à des attaques par injection si vous utilisez SQL dynamique de peur de subir la colère de little Bobby Tables :-)

+0

+ merci de me rappeler les attaques par injection. – THEn

Questions connexes