Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 以单行CSV形式返回多行数据集,不带临时表_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

Sql server 以单行CSV形式返回多行数据集,不带临时表

Sql server 以单行CSV形式返回多行数据集,不带临时表,sql-server,tsql,sql-server-2008,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

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

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
结果集始终为一排,因此John Smith:| 646-465-4566 |有黑莓、Palm、康柏|喜欢:沙滩漫步、彩虹、萨克斯管

然而,我需要能够在另一个查询中使用这个。。。像

Select b.Name, c.Number, d.MulitLineCrap FROM Tables 
我该怎么做,提前谢谢你


顺便说一句,如果任何人有任何想法,我也可以在林克做

这里有一种基于查询生成逗号分隔列表的方法(只需将第一个块中的查询替换为块)。现在,这与你对b和c的查询有什么联系,我不知道。您需要提供一个更完整的问题,包括第二次查询返回的行数,以及这些行的“multilecrap”是否相同,或者是否取决于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;

请使用一些有意义的别名,而不是仅仅连续应用
a
b
、c
,等等。我保证,您的查询会更容易阅读。

只是好奇为什么您会人为地限制您的解决方案,说“没有临时表”?如果解决方案有效且速度足够快,为什么您会关心它是否使用临时表?@Aaron感谢您的回复。。。MSSQL 2008。。。我的T-SQL有点生疏(该死的LINQ!)我可以在select语句中使用临时表吗?那太好了,我们需要更多的信息。“表”b和c与tbl_自定义_代码_10和dbo.答辩人的输出有何关联?为什么第一个查询使用recordid=116?这取决于第二个查询的输出吗?我在上面补充说,结果集总是一行,它将是受访者的状态报告,因此John Smith:| 646-465-4566 |有黑莓、Palm、康柏|喜欢:在海滩上散步、彩虹、,萨克斯管等…感谢你们面对我明显无法正确陈述这个问题的病人。。。还有一个简单的问题,你能把表格作为MSSQL中的参数传递进来吗。。。我有自定义表1-100…不,你不能在函数中动态命名表,这需要动态SQL,而函数中不支持动态SQL。如果所有自定义表都有相同的基本列,我将实现一个表,其中1-100作为INT列/键,以定义您正在谈论的“表”。不,您也不希望在块时保持100
大小写。如果实现一个表而不是100个表,则只需要一个额外的where子句,例如dbo.tbl_custom_codes,其中codeset=10和…
。啊,很遗憾,我没有应用程序的源代码,因此无法更改数据库的架构。。。