簡體   English   中英

將varchar值'RN'轉換為數據類型int時轉換失敗

[英]Conversion failed when converting the varchar value 'RN' to data type int

我在sql-server上使用rownumber函數時遇到轉換錯誤。 我知道已經發布了大量類似的主題,但我還是看了看它們,發現它們有不同的問題。

將varchar值'RN'轉換為數據類型int時,轉換失敗。

它沒有告訴我問題出在哪里。 除了行號功能之外,沒有人知道它可能出問題的地方嗎?

該CTE正在獲取之前的交易

, PRETRANSACTIONS AS (

    SELECT DISTINCT

     CONT.POH_ID                                                AS POH_ID
    ,CONT.POH_POLICYNUMBER                                      AS Contract_Number

    ,row_number() over (
    partition by CONT.POH_ID
    order by TRANS.txh_effectivedate desc
    )                                                           AS 'RN'

    ,TXN_STAT.Txs_DESCRIPTION_I                                 AS Transaction_Status_2
    ,TRANS.txh_effectivedate                                    AS Transaction_Date_2
    ,TXN_DES.Txt_DESCRIPTION_I                                  AS Transaction_Type_2
    ,TRX_RES.TRE_AMTPROCESSED                                   AS Transaction_Amount_2

    From Se2FAST.dbo.Cm_Opt_Poh_PolicyHdr_S CONT

    JOIN BASE BASE
        ON BASE.Poh_ID = CONT.POH_ID

    INNER JOIN Se2FAST.dbo.Cm_Opt_Pch_PolicyCovHdr_S policyCov 
        ON CONT.Poh_ID = policyCov.Pch_POLICYHDRID
        AND policycov.pch_sequence = 1  
    INNER JOIN [dbo].[Cm_Sys_Pst_PolicyStatus_I] PST 
        ON PST.Pst_ID_I  = CONT.Poh_Status      
    LEFT JOIN se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRANS
        ON TRANS.TXH_POLICYHDRID = CONT.POH_ID

    AND TRANS.txh_effectivedate < ( SELECT TOP 1 TRAN1.txh_effectivedate 
                                    FROM se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRAN1 
                                    WHERE TRAN1.TXH_POLICYHDRID = CONT.POH_ID
                                    ORDER BY txh_effectivedate DESC)                                       

    LEFT JOIN se2Fast.dbo.Cm_Opt_Tre_TrxRes_S AS TRX_RES
        ON TRANS.Txh_ID = TRX_RES.Tre_TRXHDRID
    LEFT  JOIN se2Fast.dbo.Cm_Sys_Txt_TrxType_I TXN_DES
        ON TRANS.Txh_TRXTYPEID = TXN_DES.Txt_ID_I
        --AND TXN_DES.Txt_DESCRIPTION_I NOT IN (            
        --'Anniversary','Monthiversary','Quarterversary','Calendar Year End')
        --AND TXN_DES.Txt_DESCRIPTION_I IS NOT NULL
    LEFT JOIN se2Fast.dbo.Cm_Sys_Txs_TrxStatus_I TXN_STAT
        ON Trans.Txh_TRXSTATUS = TXN_STAT.Txs_ID_I
        AND TXN_STAT.Txs_DESCRIPTION_I  = 'Completed'

     WHERE 'RN' = 2

WHERE'RN'= 2正在比較兩個值,字符串'RN'和整數2。當SQL Server解析表達式時,它將嘗試將文字值'RN'轉換為數值以執行整數比較。 顯然,RN無法轉換為數值,因此會出現錯誤。

在SQL Server中,別名在WHERE / GROUP / HAVING子句之后但在ORDER BY子句之前實現。 這意味着您不能在為其分配查詢的過濾器中使用別名。 您需要先在子查詢中生成列別名,然后才能在比較中使用它。


您似乎混淆了查詢。 您從CTE開始,名為“ PRETRANSACTIONS”,但隨后您嘗試將其別名作為右括號后的列AS“ RN”。 必須先在FROM中引用CTE,然后才能使用SELECT中的列。 如果這只是一個列表達式,請在開頭刪除“ PRETRANSACTIONS AS”。

WITH PRETRANSACTIONS AS (

    SELECT DISTINCT

     CONT.POH_ID                                                AS POH_ID
    ,CONT.POH_POLICYNUMBER                                      AS Contract_Number

    ,row_number() over (
    partition by CONT.POH_ID
    order by TRANS.txh_effectivedate desc)
                                                              AS RN)

    SELECT RN,
TXN_STAT.Txs_DESCRIPTION_I                                 AS Transaction_Status_2
    ,TRANS.txh_effectivedate                                    AS Transaction_Date_2
    ,TXN_DES.Txt_DESCRIPTION_I                                  AS Transaction_Type_2
    ,TRX_RES.TRE_AMTPROCESSED                                   AS Transaction_Amount_2

    From Se2FAST.dbo.Cm_Opt_Poh_PolicyHdr_S CONT

    JOIN BASE BASE
        ON BASE.Poh_ID = CONT.POH_ID
JOIN PRETRANSACTIONS 
 ON BASE.POH_ID = PRETRANSACTIONS.POH_ID
    INNER JOIN Se2FAST.dbo.Cm_Opt_Pch_PolicyCovHdr_S policyCov 
        ON CONT.Poh_ID = policyCov.Pch_POLICYHDRID
        AND policycov.pch_sequence = 1  
    INNER JOIN [dbo].[Cm_Sys_Pst_PolicyStatus_I] PST 
        ON PST.Pst_ID_I  = CONT.Poh_Status      
    LEFT JOIN se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRANS
        ON TRANS.TXH_POLICYHDRID = CONT.POH_ID

    AND TRANS.txh_effectivedate < ( SELECT TOP 1 TRAN1.txh_effectivedate 
                                    FROM se2Fast.DBO.CM_OPT_TXH_TRXHDR_S TRAN1 
                                    WHERE TRAN1.TXH_POLICYHDRID = CONT.POH_ID
                                    ORDER BY txh_effectivedate DESC)                                       

    LEFT JOIN se2Fast.dbo.Cm_Opt_Tre_TrxRes_S AS TRX_RES
        ON TRANS.Txh_ID = TRX_RES.Tre_TRXHDRID
    LEFT  JOIN se2Fast.dbo.Cm_Sys_Txt_TrxType_I TXN_DES
        ON TRANS.Txh_TRXTYPEID = TXN_DES.Txt_ID_I
        --AND TXN_DES.Txt_DESCRIPTION_I NOT IN (            
        --'Anniversary','Monthiversary','Quarterversary','Calendar Year End')
        --AND TXN_DES.Txt_DESCRIPTION_I IS NOT NULL
    LEFT JOIN se2Fast.dbo.Cm_Sys_Txs_TrxStatus_I TXN_STAT
        ON Trans.Txh_TRXSTATUS = TXN_STAT.Txs_ID_I
        AND TXN_STAT.Txs_DESCRIPTION_I  = 'Completed'

     WHERE PRETRANSACTIONS.RN = 2

另外,切勿在與ROW_NUMBER相同的集合中使用DISTINCT。 ROW_NUMBER為每一行生成一個唯一的編號,因此每一行都是不同的。 所有要做的就是增加排序開銷,而不消除任何行。 您可以改用RANK或DENSE_RANK。

不要使用“ RN”,僅使用RN不帶引號。

之所以會出現此錯誤,是因為您正在將where子句中的Text值“ RN”與Integer值2進行比較。 但是,由於“ RN”是一列,您想返回“ RN”字段中值為2的所有文件,而不是

WHERE **'RN'** = 2

只需輸入

 WHERE RN = 2

RN不帶引號,因為它是列的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM