我有一个列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
答案 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