TSQL函数返回一串分隔的电子邮件 - 尝试嵌套选择

时间:2012-09-22 10:19:32

标签: sql string tsql function append

我有一个列email的表格。我需要以字符串形式返回所有这些电子邮件。我正在尝试这段代码,但得到了:

Msg 102, Level 15, State 1, Procedure getemailjcp, Line 24
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Procedure getemailjcp, Line 31
Incorrect syntax near 'a'.

TSQL功能:

ALTER function [dbo].[getemails]
(
    @DB_Name varchar(100)
)
Returns varchar(4000)
AS
BEGIN
    DECLARE @out varchar (4000);
    DECLARE @in varchar (4000);
    SET @out =
        (
            SELECT @in = @in + email +'; ' 
            FROM 
                (
                    SELECT DISTINCT ISNULL(U.nvarchar4, 'NA') as email
                    FROM
                        sometable
            ) a
        ) b
    RETURN @out
END

3 个答案:

答案 0 :(得分:1)

在SO中有很多关于这个主题,here例如你会看到几种不同的解决方案。

来自Vikdor的正确评论。如果您的表具有重复的电子邮件值,并且您不想要它们并且只是连接不同的电子邮件值,那么请使用嵌套查询。

SELECT @in = COALESCE(@in, ';', '') + b.emails +'; ' 
  FROM (
        SELECT DISTINCT ISNULL(U.nvarchar4, 'NA') as emails FROM sometable
       ) b

在这种情况下,您可以使用SQL Fiddle代码。

如果你想真正深入研究这个连接问题,这里有一篇关于这个主题的详细文章。

Concatenating Row Values in Transact-SQL

如果不需要DISTINCT子句,则不需要使用嵌套的select子句。您只需将电子邮件列值添加到要输出的变量中。

对于您的情况,请使用此SELECT子句:

SELECT @in = COALESCE(@in + '; ', '') + ISNULL(U.nvarchar4, 'NA')
  FROM sometable

检查此SQL Fiddle工作代码。

答案 1 :(得分:0)

这样可行(不确定@DB_name的使用位置,顺便说一下):

ALTER function [dbo].[getemails]
(
    @DB_Name varchar(100)
)
Returns varchar(4000)
AS
BEGIN
    DECLARE @in varchar (4000);
    SELECT @in = ''
    SELECT @in = @in + email +'; ' 
    FROM 
        (
            SELECT DISTINCT ISNULL(U.nvarchar4, 'NA') as email FROM sometable
        ) b
    RETURN @in
END

答案 2 :(得分:0)

尝试使用以下

CREATE function [dbo].[getemails] 
( 
    @DB_Name nvarchar(100) 
) 
Returns nvarchar(max) 
AS 
    BEGIN 
    DECLARE @in nvarchar (max); 
    SELECT @in = ISNULL(@in, '') + b.emails +'; '  
    FROM ( 
        SELECT DISTINCT ISNULL(U.nvarchar4, 'NA') as emails FROM sometable
       ) b
    RETURN @in 
END