将多行数据集作为单行CSV返回,不带临时表

时间:2011-08-22 15:11:12

标签: sql-server tsql sql-server-2008

我正在对一个愚蠢的数据库做一些报道,我必须做

SELECT [DESC] as 'Description' 
FROM dbo.tbl_custom_code_10 a
INNER JOIN dbo.Respondent b ON CHARINDEX(',' + a.code + ',', ',' + b.CC10) > 0 
WHERE recordid = 116

哪个返回多行

 Palm
 Compaq
 Blackberry

编辑* 架构是

Respondent Table (At a Glance) ...

*recordid   lname   fname   address CC10     CC11     CC12     CC13*
116         Smith   John    Street  1,4,5,   1,3,4,   1,2,3,   NULL

Tbl_Custom_Code10

*code   desc*
0       None
1       Palm
10      Samsung
11      Treo
12      HTC
13      Nokia
14      LG
15      HP
16      Dash

结果集总是1行,所以John Smith:| 646-465-4566 |有黑莓,棕榈,康柏|喜欢:在沙滩上散步,彩虹,萨克斯管

但是我需要能够在另一个查询中使用它...比如

Select b.Name, c.Number, d.MulitLineCrap FROM Tables 

我怎么能这样做,提前谢谢......

顺便说一句,如果有任何想法,我也可以在LINQ中做到这一点......

1 个答案:

答案 0 :(得分:2)

以下是基于查询创建逗号分隔列表的一种方法(只需替换第一个WITH块内的查询)。现在,如何加入对b和c的查询,我不知道。您需要提供更完整的问题 - 包括有关从第二个查询返回的行数以及“MultilineCrap”对于每个行是否相同或者是否依赖于b / c中的数据的具体信息。

;WITH x([DESC]) AS 
(
    SELECT 'Palm'
        UNION ALL SELECT 'Compaq'
        UNION ALL SELECT 'Blackberry'
),
y([DESC]) AS
(
    SELECT ',' + [DESC]
    FROM x 
    FOR XML PATH('')
)
SELECT MultilineCrap = STUFF([DESC], 1, 1, '')
FROM y;

编辑

鉴于新的要求,也许这是最好的方法:

CREATE FUNCTION dbo.GetMultiLineCrap
(
    @s VARCHAR(MAX)
) 
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @x VARCHAR(MAX) = '';

    SELECT @x += ',' + [desc]
        FROM dbo.tbl_custom_code_10
        WHERE ',' + @s LIKE '%,' + RTRIM(code) + ',%';

    RETURN (SELECT STUFF(@x, 1, 1, ''));
END
GO

SELECT r.LName, r.FName, MultilineCrap = dbo.GetMultiLineCrap(r.CC10)
    FROM dbo.Respondent AS r
    WHERE recordid = 116;

请使用有点意义的别名,而不是仅仅串行应用ab,c等。我保证,您的查询会更容易阅读。