Как вернуть запрос T-SQL с именами столбцов в качестве первой строки

Я пишу пакет SSIS для вывода данных из базы данных SQL Server 2012 в .CSV файл для клиента. Требование состоит в том, чтобы в первой строке были имена столбцов. Ниже приведен запрос, который я написал для источника в задаче потока данных. Проблема в том, что он всегда возвращает имена столбцов как ПОСЛЕДНЮЮ строку, а не первую. Почему? Как мне этого добиться?

DECLARE @Today AS DateTime= GETDATE()
DECLARE @NextPayrollDate AS DateTime

EXEC mobile.getNextPayrollDate @Today, @NextPayrollDate OUTPUT

;WITH LatestEligible (EmployeeID, LatestBillVerified) AS
(
    SELECT 
        EmployeeID, MAX(DateBillVerified) AS LatestBillVerified
    FROM 
        Inv_DataReimbursement
    GROUP BY 
        EmployeeID
)
SELECT
    'Edit Set' AS 'Edit Set', 
    'Employee No.' AS 'Employee No.'
FROM 
    LatestEligible

UNION

SELECT 
    NULL AS 'Edit Set',
    d.EmployeeID AS 'Employee No.'
FROM 
    LatestEligible d
INNER JOIN 
    Employee e ON d.EmployeeID = e.EmployeeID
INNER JOIN 
    Inv_DataReimbursement dr ON d.EmployeeID = dr.EmployeeID 
                             AND d.LatestBillVerified = dr.DateBillVerified
WHERE 
    (dr.MonthlyServiceEligible = 'true'
     OR (dr.MonthlyServiceEligible = 'false' 
         AND e.DateEnd IS NOT NULL 
         AND e.DateEnd > @NextPayrollDate))
    AND dr.ActualAmount > 0

person Melanie    schedule 19.04.2019    source источник


Ответы (2)


Как мне этого добиться?

Не делайте этого через SQL.

Просто установите флажок Имена столбцов в первой строке данных в Диспетчер соединений с плоскими файлами и оставьте исходный запрос нетронутым.

Заголовки столбцов будут добавлены автоматически без необходимости объединения этих дополнительных метаданных (и, возможно, преобразования всего в строку на стороне SQL).

person Martin Smith    schedule 19.04.2019
comment
Когда я это делаю, я не получаю имена столбцов, которые я назначаю в своем операторе SQL в источнике данных OLE DB; Я получаю имена, которые SSIS назначает случайным образом столбцам в моей электронной таблице. Таблица изначально пуста - без имен столбцов. - person Melanie; 22.04.2019
comment
Хорошо, я думаю, что понял. Если я создаю файл csv ТОЛЬКО с именами столбцов, а затем связываюсь с диспетчером соединений с плоскими файлами с проверенными именами столбцов в первой строке данных, он работает! Спасибо! - person Melanie; 22.04.2019

Вы можете попробовать UNION ALL:

SELECT
'Edit Set' AS 'Edit Set', 'Employee No.' AS 'Employee No.'
FROM LatestEligible
UNION ALL
SELECT DISTINCT
NULL AS 'Edit Set',
d.EmployeeID AS 'Employee No.'
FROM LatestEligible d
INNER JOIN Employee e
ON d.EmployeeID = e.EmployeeID
INNER JOIN Inv_DataReimbursement dr
ON d.EmployeeID = dr.EmployeeID AND d.LatestBillVerified = 
dr.DateBillVerified
WHERE (dr.MonthlyServiceEligible = 'true'
OR (dr.MonthlyServiceEligible = 'false' AND e.DateEnd IS NOT NULL AND 
e.DateEnd > @NextPayrollDate))
AND dr.ActualAmount > 0
person Lukasz Szozda    schedule 19.04.2019
comment
Вот и все! Я пробовал UNION ALL, но на самом деле он добавил DISTINCT в оба оператора SELECT. Готово и сделано. Огромное спасибо! - person Melanie; 19.04.2019
comment
Это не гарантирует порядок и не является хорошим способом достижения заявленной цели. - person Martin Smith; 19.04.2019