Как вернуть запрос 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

2 ответа

Решение

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

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

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

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

Вы могли бы попробовать 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
Другие вопросы по тегам