0

计划将以下内容放入存储过程中,但我现在觉得它更适合成为 udf。

它需要一个如下所示的小表:

在此处输入图像描述

并返回一个这样的字符串:

一个@bc; b@cd; c@de

如何从以下内容中删除临时表,以便将其转换为函数?

CREATE FUNCTION dbo.udf_emailString
(
    @x  NVARCHAR(50) = NULL
)
RETURNS VARCHAR(2000)
BEGIN
SET NOCOUNT ON;


--1.get all the related email addresses connected with @x and @y
WITH allAddresses(Email)
    AS
    (
    SELECT  Email
    FROM    WH.xxx.vw_Permissions
    WHERE   IndReceiveMail = 1 AND
            X = COALESCE(@x,X)
    GROUP BY Email
    )
, allAddressesRn(Email, rn)
    AS
    (
    SELECT  Email,
            ROW_NUMBER() OVER(ORDER BY Email)
    FROM    allAddresses
    ) 
SELECT  *
INTO    #EmailList
FROM    allAddressesRn;

--2.connect all of the above together seperating with semi-colons
DECLARE @fullAddress VARCHAR(2000) ='';
DECLARE @loopControl INT  = 1; 
WHILE @loopControl <= (SELECT MAX(rn) FROM #EmailList)
    BEGIN

        SET @fullAddress = 
            @fullAddress +  
                (
                SELECT  Email + '; '
                FROM    #EmailList
                WHERE   rn = @x
                );

    SET @loopControl = @loopControl + 1;
    END;

RETURN @fullAddress;

END;

编辑

有了评论和答案,这似乎是一种更紧凑的方法:

CREATE FUNCTION dbo.udf_emailString
(
    @x  NVARCHAR(50) = NULL
)
RETURNS VARCHAR(2000)
BEGIN


DECLARE @fullAddress VARCHAR(2000) ='';

SELECT @fullAddress = 
STUFF(
        (
    select '; ' + Email as [text()]
    FROM    
            (
            SELECT  Email
            FROM    WH.xxx.vw_Permissions
            WHERE   IndReceiveMail = 1 AND
                    X = COALESCE(@x,X)
            GROUP BY Email
            ) x
        for xml path ('')
)
,1,1,'');

SET @fullAddress = @fullAddress + ';';
RETURN @fullAddress;

END;
4

1 回答 1

1

正如 bluefeet 建议的那样使用 STUFF():

select @fullAddress = stuff(
        (select ';' + Email as [text()]
        from #EmailList
        for xml path (''))
        ,1,1,'')

编辑:对不起,我要说明 STUFF 功能,并且在临时表上测试更容易:)。您的整个 udf 将是:

CREATE FUNCTION dbo.udf_emailString
(
  @x  NVARCHAR(50) = NULL
)
RETURNS VARCHAR(2000)
BEGIN

--1.get all the related email addresses connected with @x and @y
WITH allAddresses(Email)
AS
(
SELECT  Email
FROM    WH.xxx.vw_Permissions
WHERE   IndReceiveMail = 1 AND
        X = COALESCE(@x,X)
GROUP BY Email
)
select @fullAddress = stuff(
    (select ';' + Email as [text()]
    from allAddresses
    for xml path (''))
    ,1,1,'');

 RETURN @fullAddress;

 END;
于 2013-09-09T21:13:01.090 回答