Was planning to put the following in a stored procedure but I now feel it lends itself better to being a udf.
It takes a small table like the following:
And returns a string like this:
a@b.c; b@c.d; c@d.e
How do I get rid of the temp table from the following so I can convert it to a function?
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;
EDIT
With the comments and answer this seems to be a much more compact approach:
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;