2

我有一个带有 column 的表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
4

3 回答 3

1

SO中有很多关于该主题的内容,例如,您将在这里看到几种不同的解决方案。

维克多的正确评论。如果您的表具有重复的电子邮件值并且您不想要它们并且只是连接不同的值,则使用嵌套查询。

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

在这里,您有适用于这种情况的SQL Fiddle代码。

如果你想更深入地了解这个串联的事情,这里有一篇关于这个主题的详细的文章。

在 Transact-SQL 中连接行值

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

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

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

检查此SQL Fiddle工作代码。

于 2012-09-22T10:45:25.143 回答
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 
于 2012-09-22T11:45:53.457 回答
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
于 2012-09-22T10:35:06.307 回答