繁体   English   中英

SQL CSV 作为查询结果列

[英]SQL CSV as Query Results Column

我有以下 SQL 查询单个表、单行,并将结果作为逗号分隔的字符串返回,例如

Forms
1, 10, 4

查询语句:

DECLARE @tmp varchar(250)
SET @tmp = ''
SELECT @tmp = @tmp + Form_Number + ', '
FROM  Facility_EI_Forms_Required
WHERE Facility_ID = 11 AND EI_Year=2012 -- single Facility, single year
SELECT SUBSTRING(@tmp, 1, LEN(@tmp) - 1) AS Forms

Facility_EI_Forms_Required 表有三个记录,Facility_ID = 11

Facility_ID EI_Year Form_Number
11  2012    1
11  2012    10
11  2012    4

Form_number是一个 varchar 字段。

我有一个带有 Facility_ID 和 Facility_Name++ 的 Facility 表。

如何创建查询以查询给定年份的所有设施并生成 CSV 输出字段?

到目前为止我有这个:

DECLARE @tmp varchar(250)
SET @tmp = ''
SELECT TOP 100 A.Facility_ID, A.Facility_Name,
    (
    SELECT @tmp = @tmp + B.Form_Number + ', '
    FROM  B
    WHERE B.Facility_ID = A.Facility_ID 
    AND B.EI_Year=2012
    )
FROM Facility A, Facility_EI_Forms_Required B

但是在使用@tmp 时会出现语法错误

我的猜测是这对于查询来说太复杂了,可能需要存储过程,但我对 SP 知之甚少。 这可以通过嵌套查询来完成吗?


我尝试了标量值函数

ALTER FUNCTION [dbo].[sp_func_EI_Form_List] 
(
    -- Add the parameters for the function here
    @p1 int,
    @pYr int
)
RETURNS varchar
AS
BEGIN
    -- Declare the return variable here
    DECLARE @Result varchar

    -- Add the T-SQL statements to compute the return value here
    DECLARE @tmp varchar(250)
    SET @tmp = ''
    SELECT @tmp = @tmp + Form_Number + ', '
    FROM OIS..Facility_EI_Forms_Required
    WHERE Facility_ID = @p1 AND EI_Year = @pYr -- single Facility, single year

    SELECT @Result = @tmp -- SUBSTRING(@tmp, 1, LEN(@tmp) - 1)-- @p1

    -- Return the result of the function
    RETURN @Result

END

电话

select Facility_ID, Facility.Facility_Name, 
   dbo.sp_func_EI_Form_List(Facility_ID,2012)
from facility where Facility_ID=11

返回

Facility_ID Facility_Name   Form_List
11  Hanson Aggregates   1

所以它只返回第一条记录而不是所有三个记录。 我究竟做错了什么?

尝试以下方法,它类似于 SO answer Concatenate many rows into a single text string 我希望它是正确的,因为我无法在没有架构和一些演示数据的情况下进行尝试(也许您可以将架构和数据添加到您的问题中):

Select distinct A.Facility_ID, A.Facility_Name, 
    substring(
        (
            Select ',' + B.Form_Number AS [text()]
            From Facility_EI_Forms_Required B
            Where B.Facility_ID = A.Facility_ID 
            AND B.EI_Year=2012
            ORDER BY B.Facility_ID
            For XML PATH ('')
        ), 2, 1000) [Form_List]
From Facility A

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM