【问题标题】:How do i find number of columns returned by a complex SQL query如何查找复杂 SQL 查询返回的列数
【发布时间】:2016-05-11 10:16:57
【问题描述】:

采取以下示例查询。我想查找查询返回的列数

SELECT '29-JAN-16' AS AS_OF_DATE,
       WBD.CASHPOOL_TREAS_CODE,
       WBD.CNTRPART_TREAS_CODE,
       WBD.PRIN_BAL_AMT,
       (SELECT EX.EOD_SPOT_CNV_RATE
          FROM EDW.T_FACT_EXCH_RATE_LONG EX,
               EDW.T_DIM_DATE            DT,
               EDW.T_DIM_CURR            FC,
               EDW.T_DIM_CURR            TC
         WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
           AND EX.FROM_CURR_KEY = FC.CURR_KEY
           AND EX.TO_CURR_KEY = TC.CURR_KEY
           AND EXISTS (SELECT DT.CAL_DATE
                  FROM EDW.T_FACT_EXCH_RATE_LONG EX,
                       EDW.T_DIM_DATE            DT,
                       EDW.T_DIM_CURR            FC,
                       EDW.T_DIM_CURR            TC
                 WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
                   AND EX.FROM_CURR_KEY = FC.CURR_KEY
                   AND EX.TO_CURR_KEY = TC.CURR_KEY
                   AND TC.CURR_CODE = 'USD')
           AND EXISTS (SELECT FC.CURR_CODE
                  FROM EDW.T_FACT_EXCH_RATE_LONG EX,
                       EDW.T_DIM_DATE            DT,
                       EDW.T_DIM_CURR            FC,
                       EDW.T_DIM_CURR            TC
                 WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
                   AND EX.FROM_CURR_KEY = FC.CURR_KEY
                   AND EX.TO_CURR_KEY = TC.CURR_KEY
                   AND TC.CURR_CODE = 'USD')) AS EOD_SPOT_CNV_RATE,

       (SELECT EX.MOR_CURR_CNV_RATE
          FROM EDW.T_FACT_EXCH_RATE_LONG EX,
               EDW.T_DIM_DATE            DT,
               EDW.T_DIM_CURR            FC,
               EDW.T_DIM_CURR            TC
         WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
           AND EX.FROM_CURR_KEY = FC.CURR_KEY
           AND EX.TO_CURR_KEY = TC.CURR_KEY
           AND EXISTS (SELECT DT.CAL_DATE
                  FROM EDW.T_FACT_EXCH_RATE_LONG EX,
                       EDW.T_DIM_DATE            DT,
                       EDW.T_DIM_CURR            FC,
                       EDW.T_DIM_CURR            TC
                 WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
                   AND EX.FROM_CURR_KEY = FC.CURR_KEY
                   AND EX.TO_CURR_KEY = TC.CURR_KEY
                   AND TC.CURR_CODE = 'USD')
           AND EXISTS (SELECT FC.CURR_CODE
                  FROM EDW.T_FACT_EXCH_RATE_LONG EX,
                       EDW.T_DIM_DATE            DT,
                       EDW.T_DIM_CURR            FC,
                       EDW.T_DIM_CURR            TC
                 WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
                   AND EX.FROM_CURR_KEY = FC.CURR_KEY
                   AND EX.TO_CURR_KEY = TC.CURR_KEY
                   AND TC.CURR_CODE = 'USD')) MOR_CURR_CNV_RATE,
       (SELECT EX.MNTHLY_GAP_CURR_CNV_RATE
          FROM EDW.T_FACT_EXCH_RATE_LONG EX,
               EDW.T_DIM_DATE            DT,
               EDW.T_DIM_CURR            FC,
               EDW.T_DIM_CURR            TC
         WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
           AND EX.FROM_CURR_KEY = FC.CURR_KEY
           AND EX.TO_CURR_KEY = TC.CURR_KEY
           AND EXISTS (SELECT DT.CAL_DATE
                  FROM EDW.T_FACT_EXCH_RATE_LONG EX,
                       EDW.T_DIM_DATE            DT,
                       EDW.T_DIM_CURR            FC,
                       EDW.T_DIM_CURR            TC
                 WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
                   AND EX.FROM_CURR_KEY = FC.CURR_KEY
                   AND EX.TO_CURR_KEY = TC.CURR_KEY
                   AND TC.CURR_CODE = 'USD')
           AND EXISTS (SELECT FC.CURR_CODE
                  FROM EDW.T_FACT_EXCH_RATE_LONG EX,
                       EDW.T_DIM_DATE            DT,
                       EDW.T_DIM_CURR            FC,
                       EDW.T_DIM_CURR            TC
                 WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
                   AND EX.FROM_CURR_KEY = FC.CURR_KEY
                   AND EX.TO_CURR_KEY = TC.CURR_KEY
                   AND TC.CURR_CODE = 'USD')) MNTHLY_GAP_CURR_CNV_RATE,
       (SELECT EX.QTRLY_GAP_CURR_CNV_RATE
          FROM EDW.T_FACT_EXCH_RATE_LONG EX,
               EDW.T_DIM_DATE            DT,
               EDW.T_DIM_CURR            FC,
               EDW.T_DIM_CURR            TC
         WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
           AND EX.FROM_CURR_KEY = FC.CURR_KEY
           AND EX.TO_CURR_KEY = TC.CURR_KEY
           AND EXISTS (SELECT DT.CAL_DATE
                  FROM EDW.T_FACT_EXCH_RATE_LONG EX,
                       EDW.T_DIM_DATE            DT,
                       EDW.T_DIM_CURR            FC,
                       EDW.T_DIM_CURR            TC
                 WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
                   AND EX.FROM_CURR_KEY = FC.CURR_KEY
                   AND EX.TO_CURR_KEY = TC.CURR_KEY
                   AND TC.CURR_CODE = 'USD')
           AND EXISTS (SELECT FC.CURR_CODE
                  FROM EDW.T_FACT_EXCH_RATE_LONG EX,
                       EDW.T_DIM_DATE            DT,
                       EDW.T_DIM_CURR            FC,
                       EDW.T_DIM_CURR            TC
                 WHERE EX.FIN_DATE_KEY = DT.DATE_KEY
                   AND EX.FROM_CURR_KEY = FC.CURR_KEY
                   AND EX.TO_CURR_KEY = TC.CURR_KEY
                   AND TC.CURR_CODE = 'USD')) QTRLY_GAP_CURR_CNV_RATE
  FROM EDW.T_ICF_CASHPOOL_ACCT_DETL ICAD
  LEFT OUTER JOIN (SELECT MLC.PD_TO_DATE,
                          ICBD.BAL_RPTG_DATE,
                          ICBD.IHB_ACCT_ID,
                          ICBD.BAL_CURR_CODE,
                          ICBD.OPEN_PRIN_BAL_AMT,
                          ICBD.PRIN_ADDN_AMT,
                          ICBD.PRIN_RPYMT_AMT,
                          ICBD.CLOSG_PRIN_BAL_AMT,
                          ICBD.OPEN_INT_BAL_AMT,
                          ICBD.ACCR_INT_CHRG_AMT,
                          ICBD.INT_SETL_AMT,
                          ICBD.CLOSG_INT_BAL_AMT,
                          ICBD.CASHPOOL_TREAS_CODE,
                          ICBD.CNTRPART_TREAS_CODE,
                          ICBD.PRIN_BAL_AMT
                     FROM EDW.T_ICF_CASHPOOL_BAL_DETL ICBD
                     JOIN EDW.T_MD_LOAD_CNTL MLC
                       ON MLC.SRCE_SYS_NM = 'EDW'
                      AND ICBD.BAL_RPTG_DATE = MLC.PD_TO_DATE) WBD
    ON ICAD.IHB_ACCT_ID = WBD.IHB_ACCT_ID

我曾尝试将 Informatica 中的逻辑用作: 在 'SELECT' 和 'FROM' 之间计算逗号 + 1 的数量。但是当有像上面查询这样的派生列时,这个逻辑就会失败。有什么办法可以解决这个问题?解决方案可以来自 Informatica 、UNIX 脚本。不建议直接在数据库中运行查询

PS:我知道这里的列数是 8。这个查询只是一个示例。我想通过表达式转换中的某些逻辑计算列数,甚至 UNIX 脚本都可以

【问题讨论】:

    标签: sql unix informatica-powercenter


    【解决方案1】:

    数一数。

    有 8 列。

    【讨论】:

    • 太棒了。这个的小弟,如果从代码中读不出来,就运行查询,统计输出列数。
    • 我猜你没有正确理解这个问题。我不需要只计算这个查询的列数。我提出的查询只是一个示例。它是由用户在平面文件中输入的,我需要在 informatica 中计算表达式转换中的列数,以便通过 SQL 转换进一步处理
    【解决方案2】:

    要么按照CathalMF 的回答手动计算它们,要么使用Select Into 将此查询的结果插入到新表中,然后使用以下查询找出列数:

    SELECT COUNT(*)
    FROM sys.columns c
    WHERE c.object_id = OBJECT_ID('MyTable')
    

    如果执行查询不是一个选项,那么您将不得不纠正某种代码来解析 sql 查询并找出列数。就像你说的计算逗号的数量。对于派生列,您需要匹配左括号和右括号,而不是计算这些括号内的逗号。这是一种方法。

    【讨论】:

    • 就像我上面说的,在 DB 上触发这个查询不是一个选项。在我的 informatica 映射中,我需要检查用户输入的源和目标查询是否包含相同数量的列。如果没有,则给出错误,如果匹配,则管道中的下一个 SQL 转换将运行查询。我使用了上面提到的表达式转换中的逻辑来查找列数,但派生列失败。我想知道一些其他可以使用的逻辑
    猜你喜欢
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多