将行组合到一个SQL Server中

时间:2017-04-28 11:57:49

标签: sql-server

我的选择查询返回10行的列表。

我尝试使用COALESCE,但异常抛出“子查询返回的值超过1。当子查询跟随=,!=,<,< =,>,> =或者子查询用作表达式。“

我的查询:

DECLARE @sqlDetails NVARCHAR(MAX);
SET @sqlDetails = COALESCE( @sqlDetails + ' ', '') + (  SELECT
                                                        rp.RuleDetails 
                                                    FROM 
                                                        RuleBook rb, 
                                                        RuleException re, 
                                                        RuleParameters rp 
                                                    WHERE 
                                                        rb.RuleBookID = 57 AND
                                                        rb.RuleBookID = re.RuleBookID AND 
                                                        rp.RuleBookID = re.RuleBookID AND
                                                        rp.RuleDetails NOT LIKE '%TRIGGER%' AND
                                                        rp.RuleDetails NOT LIKE '%EmailTo%');

我需要将返回连接成一行,我该怎么做?

感谢。

2 个答案:

答案 0 :(得分:1)

尝试使用STUFF AND FOR XML PATH 看到 How Stuff and 'For Xml Path' work in Sql Server

SET @sqlDetails = STUFF((SELECT ','+RuleDetails FROM RuleBook rb, RuleException re, RuleParameters rp 
where rb.RuleBookID = 57 AND rb.RuleBookID = re.RuleBookID AND rp.RuleBookID = re.RuleBookID AND rp.RuleDetails NOT LIKE '%TRIGGER%' AND rp.RuleDetails NOT LIKE '%EmailTo%'FOR XML PATH('')) , 1 , 1 , '' )

答案 1 :(得分:0)

嘿Jose,因为你正在尝试将数据输入变量,我的假设是你只需要一条记录。由于变量无法存储多个值。

请查看以下查询是否有助于您的要求。

DECLARE @sqlDetails NVARCHAR(MAX);
SET @sqlDetails = COALESCE( @sqlDetails + ' ', '') + (  SELECT
                                                        TOP 1 rp.RuleDetails 
                                                    FROM 
                                                        RuleBook rb, 
                                                        RuleException re, 
                                                        RuleParameters rp 
                                                    WHERE 
                                                        rb.RuleBookID = 57 AND
                                                        rb.RuleBookID = re.RuleBookID AND 
                                                        rp.RuleBookID = re.RuleBookID AND
                                                        rp.RuleDetails NOT LIKE '%TRIGGER%' AND
                                                        rp.RuleDetails NOT LIKE '%EmailTo%');

SELECT @sqlDetails

如果您要求从 SubQuery 中提取所有记录并形成由逗号分隔的字符串,则可以使用以下查询。这与Nelsonrr先前提到过的相似

DECLARE @sqlDetails NVARCHAR(MAX);
SET @sqlDetails =(SELECT @sqlDetails ) + ',' + (SELECT STUFF((SELECT ','+
                                                        rp.RuleDetails 
                                                    FROM 
                                                        RuleBook rb, 
                                                        RuleException re, 
                                                        RuleParameters rp 
                                                    WHERE 
                                                        rb.RuleBookID = 57 AND
                                                        rb.RuleBookID = re.RuleBookID AND 
                                                        rp.RuleBookID = re.RuleBookID AND
                                                        rp.RuleDetails NOT LIKE '%TRIGGER%' AND
                                                        rp.RuleDetails NOT LIKE '%EmailTo%'FOR XML PATH('')) , 1 , 1 , ''));

SELECT @sqlDetails