2017-01-10 3 views
1

У меня есть следующий SQL, который запрашивает одну таблицу, одну строку и возвращает результаты в виде отдельной строки запятой, например.SQL CSV as Query Results Column

Forms 
1, 10, 4 

SQL:

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 с Facility_ID и Facility_Name ++.

Как создать запрос для запроса всех Facilites для данного года и создать поле вывода 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 

поэтому он возвращает только первую запись, а не все три. Что я делаю не так?

ответ

1

Пробуйте следующий подход, который является аналогом SO, отвечающим 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 
+0

Работало отлично! 'Для XML ...' немного черной магии IMO. Выдает результат, но не знает, как это сделать. Думаю, в том же классе, что и regex. – rheitzman