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