【问题标题】:How to return T-SQL query with column names as first row如何以列名作为第一行返回 T-SQL 查询
【发布时间】:2019-04-19 18:54:57
【问题描述】:

我正在编写一个 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

【问题讨论】:

    标签: sql-server tsql ssis


    【解决方案1】:

    我如何做到这一点?

    不要通过 SQL 来做。

    只需勾选Flat File Connection Manager 中的第一个数据行中的列名框,保持原始查询不变。

    然后将自动添加列标题,而无需合并这些额外的元数据(并可能在 SQL 端将所有内容转换为字符串)。

    【讨论】:

    • 当我这样做时,我没有得到我在 OLE DB 数据源的 SQL 语句中分配的列名;我得到了 SSIS 随机分配给电子表格中列的名称。电子表格最初是空白的 - 没有列名。
    • 好的,我想我明白了。如果我创建一个仅包含列名的 csv 文件,然后链接到一个平面文件连接管理器,并在第一个数据行中选中列名,它就可以工作!谢谢!
    【解决方案2】:

    你可以试试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
    

    【讨论】:

    • 就是这样!我曾尝试过 UNION ALL,但实际上是在两个 SELECT 语句中添加了 DISTINCT。做完了。非常感谢!
    • 这并不能保证秩序,也不是实现其既定目标的好方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2018-03-18
    • 2012-06-30
    相关资源
    最近更新 更多