计划将以下内容放入存储过程中,但我现在觉得它更适合成为 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;