0

作業中の連結選択から関数を作成しようとすると問題が発生します

ここで関数

CREATE FUNCTION dbo.afEvrGetConsequencesConcat
(@id_evr int,@type_evr int)
RETURNS varchar(max)
AS
BEGIN

    declare @result varchar(max)
    set @result= ''

IF @type_evr = 0 
BEGIN

    SELECT @result = @result + (case when (CEV.ID_CON is null) then CEV.NOM_CEV else CON.NOM_CON end) + ' ; '  
    from T_CONSEQUENCE_EVRP CEV 
    left join T_CONSEQUENCE CON on CEV.id_con=CON.id_con
    WHERE CEV.id_evr = @id_evr

END

IF @type_evr = 1
BEGIN

        SELECT DISTINCT @result = @result + isnull(NOM_PHR,'') + ' ; '  
        FROM T_EVRP EVR
        INNER JOIN T_EVR_CHIM CHIM on EVR.ID_EVR=CHIM.ID_EVR
        INNER JOIN T_PRODUIT PROD on CHIM.ID_PROD=PROD.ID_PROD
        INNER JOIN T_PRODUIT_PHRASE_R PROD_PHR on PROD.ID_PROD=PROD_PHR.ID_PROD
        INNER JOIN T_PHRASE_R PHR on PROD_PHR.ID_PHR=PHR.ID_PHR
        WHERE TYPE_EVR=1 AND EVR.id_evr = @id_evr AND PHR.flag_consequence = 1

        UNION 

        SELECT DISTINCT @result = @result + isnull(nom_cons_txt,'') +' ; '  
        FROM T_EVRP EVR
        INNER JOIN T_EVR_CHIM CHIM on EVR.ID_EVR=CHIM.ID_EVR
        INNER JOIN T_PRODUIT PROD on CHIM.ID_PROD=PROD.ID_PROD
        INNER JOIN t_consequence_txt PROD_CONS on PROD.ID_PROD=PROD_CONS.ID_PROD
        WHERE TYPE_EVR=1 AND EVR.id_evr = @id_evr AND PROD.transverse_prod = 1

END

    RETURN @result

END
GO

メッセージ エラーは、「Msg 444, Niveau 16, État 2, Procédure afEvrGetConsequencesConcat, Ligne 23 関数内に含まれる Select ステートメントは、クライアントにデータを返すことはできません」です。

上記の SELECT は、関数の外でもうまく機能します。毎回、SELECT 連結と一致する @result に 1 つの varchar を取得しました。そして、この類似関数もうまく機能します:

CREATE FUNCTION dbo.afEvrGetControleConcat
(@id_evr int,@type_evr int,@type_ctrl int)
RETURNS varchar(8000)
AS
BEGIN
    declare @result varchar(8000)
    set @result= ''

    -- 0 tous
    -- 1 date + comm


    IF @type_ctrl = 0
    BEGIN   

        SELECT @result = @result + ( CONVERT(VARCHAR(10),date_ctr, 103) + ' - ' + CONVERT(VARCHAR(30),isnull(valeur_mesure,'')) + ' - ' + isnull(unite_mesure,'') + ' - ' + com_ctr  ) + ' ;'
        FROM t_controle_exposition 
        WHERE id_evr = @id_evr

    END

    IF @type_ctrl = 1
    BEGIN   

        SELECT @result = @result + ( CONVERT(VARCHAR(10),date_ctr, 103) + ' - ' + com_ctr  ) + ' ;'
        FROM t_controle_exposition 
        WHERE id_evr = @id_evr

    END

    RETURN @result

END
GO

では、何が問題なのですか?論理的には、テーブルやファンキーなデータではなく、varchar を返したいと考えています。だから私はこのエラーメッセージを理解していません。

お手伝いありがとうございます。

編集: 一時テーブルを追加し、UNION の結果内に挿入し、次に連結するとうまく機能します:)

CREATE FUNCTION dbo.afEvrGetConsequencesConcat
(@id_evr int,@type_evr int)
RETURNS varchar(max)
AS
BEGIN

    declare @result varchar(max)
    set @result= ''
    declare @t as table (v varchar(max))

IF @type_evr = 0 
BEGIN

    SELECT @result = @result + (case when (CEV.ID_CON is null) then CEV.NOM_CEV else CON.NOM_CON end) + ' ; '  
    from T_CONSEQUENCE_EVRP CEV 
    left join T_CONSEQUENCE CON on CEV.id_con=CON.id_con
    WHERE CEV.id_evr = @id_evr

END

IF @type_evr = 1
BEGIN

        insert into @t 
        SELECT DISTINCT isnull(NOM_PHR,'') + ' ; '  
        FROM T_EVRP EVR
        INNER JOIN T_EVR_CHIM CHIM on EVR.ID_EVR=CHIM.ID_EVR
        INNER JOIN T_PRODUIT PROD on CHIM.ID_PROD=PROD.ID_PROD
        INNER JOIN T_PRODUIT_PHRASE_R PROD_PHR on PROD.ID_PROD=PROD_PHR.ID_PROD
        INNER JOIN T_PHRASE_R PHR on PROD_PHR.ID_PHR=PHR.ID_PHR
        WHERE TYPE_EVR=1 AND EVR.id_evr = @id_evr AND PHR.flag_consequence = 1

        UNION 

        SELECT DISTINCT isnull(nom_cons_txt,'') +' ; '  
        FROM T_EVRP EVR
        INNER JOIN T_EVR_CHIM CHIM on EVR.ID_EVR=CHIM.ID_EVR
        INNER JOIN T_PRODUIT PROD on CHIM.ID_PROD=PROD.ID_PROD
        INNER JOIN t_consequence_txt PROD_CONS on PROD.ID_PROD=PROD_CONS.ID_PROD
        WHERE TYPE_EVR=1 AND EVR.id_evr = @id_evr AND PROD.transverse_prod = 1

SELECT @result = @result + v FROM @t

END

    RETURN @result

END
GO
4

1 に答える 1