获得"超出范围的价值"将varchar数据类型转换为日期时间数据类型

时间:2014-05-21 20:17:51

标签: sql sql-server sql-server-2008

当存储过程执行将varchar数据类型转换为datetime数据类型的函数时,会发生错误

由于我无法调试发生错误的SQL语句,有没有办法可以打印在存储过程中转换的数据值并导致超出范围错误?

或者,我怎样才能找出错误发生的原因?

代码:

BEGIN
    DECLARE @MONTH VARCHAR(2) = SUBSTRING(@CASH_DATE_FROM,5,2)
    DECLARE @YEAR VARCHAR(4) = SUBSTRING(@CASH_DATE_FROM,1,4)
    DECLARE @WORK_FILE VARCHAR(80) = ''
    DECLARE @SQL VARCHAR(3000) = ''

    -- Create Report Tables

    IF (@REPORT_TYPE = '2')
    BEGIN
        SET @WORK_FILE = 'RRS.STG_PST_COLLECTIONS_REVENUE_01'
        -- print data
        --  select column  from table where column not like '%[^0-9]%';
        -- Select records from Staging 1
        SET @SQL = 'INSERT INTO ' + @WORK_FILE + 
                   ' SELECT 
                     REPORT_PERIOD, DATA_SET
                    ,RRS.udfConvertDatetime(START_CASH_DATE)START_CASH_DATE
                    ,RRS.udfConvertDatetime(END_CASH_DATE)END_CASH_DATE, TAT_GRP  
                    ,RRS.udfConvertDatetime(CASH_DATE)CASH_DATE, REMIT_ID
                    ,RRS.udfConvertDatetime(TRANSACTION_DATE)TRANSACTION_DATE, PAYMENT_AMT 
                    ,TAT, TAT_IND, ACCT_NBR, ORIGINAL_IND, CASH_TRANS_DAY_IND, TRANSFERED_TO 
                    ,TRANSFERED_TO_TAT_IND, TRANSFERED_TO_ACCT_NBR, TRANSFERED_FROM, TRANSFERED_FR_TAT_IND
                    ,TRANSFERED_FR_ACCT_NBR, AR_RETURN_IND, PYMT_TRANS_ID, UNAPPLIED_APPLIED_IND 
                    ,BACKED_OUT_DC_REF_IND, FUND_CODE, BATCH, ONLINE_ENTERED_IND, REMIT_TYPE_CODE, EFT_SW


                     FROM ' + 'RRS.LBS_28_STAGING_' +  @MONTH + '_' + @YEAR + '_1' +
                    ' WHERE AR_RETURN_IND = ' + '''A'''
        EXEC (@SQL)

        -- Select records from Staging 2        
        SET @SQL = 'INSERT INTO ' + @WORK_FILE + 
                   ' SELECT 
                     REPORT_PERIOD, DATA_SET
                    ,RRS.udfConvertDatetime(START_CASH_DATE)START_CASH_DATE
                    ,RRS.udfConvertDatetime(END_CASH_DATE)END_CASH_DATE, TAT_GRP  
                    ,RRS.udfConvertDatetime(CASH_DATE)CASH_DATE, REMIT_ID
                    ,RRS.udfConvertDatetime(TRANSACTION_DATE)TRANSACTION_DATE, PAYMENT_AMT 
                    ,TAT, TAT_IND, ACCT_NBR, ORIGINAL_IND, CASH_TRANS_DAY_IND, TRANSFERED_TO 
                    ,TRANSFERED_TO_TAT_IND, TRANSFERED_TO_ACCT_NBR, TRANSFERED_FROM, TRANSFERED_FR_TAT_IND
                    ,TRANSFERED_FR_ACCT_NBR, AR_RETURN_IND, PYMT_TRANS_ID, UNAPPLIED_APPLIED_IND 
                    ,BACKED_OUT_DC_REF_IND, FUND_CODE, BATCH, ONLINE_ENTERED_IND, REMIT_TYPE_CODE, EFT_SW

                     FROM ' + 'RRS.LBS_28_STAGING_' +  @MONTH + '_' + @YEAR + '_2' +
                    ' WHERE AR_RETURN_IND = ' + '''A'''
        EXEC (@SQL)     

        -- Update TAT_GRP
        SET @SQL = 'UPDATE ' +  @WORK_FILE + 
                   ' SET TAT_GRP = (CASE WHEN SUBSTRING(TAT,1,1) = ' + '''S''' + ' THEN ' + '''SUA''' + ' ELSE ' + '''STF''' + ' END)' +
                    ' WHERE CONVERT(VARCHAR(32),START_CASH_DATE) = ' 
                  + CHAR(39) + CONVERT(VARCHAR(32),RRS.udfConvertDatetime(@CASH_DATE_FROM))+ CHAR(39)
                   + ' AND END_CASH_DATE = ' 
                  + CHAR(39)+ CONVERT(VARCHAR(32),RRS.udfConvertDatetime(@CASH_DATE_TO))+CHAR(39)
        EXEC (@SQL) 

    END

3 个答案:

答案 0 :(得分:0)

这将帮助您查找具有非数字数据的记录:

select column  from table where column not like '%[^0-9]%';

答案 1 :(得分:0)

DATETIME数据类型的日期范围是 1753年1月1日到9999年12月31日。 因此,首先检查您在此日期范围之间传递的日期。另请检查您是否通过了无效日期,如4月31日等。

您可以使用PRINT功能打印正在形成的动态查询。 例如。 PRINT @SQL

答案 2 :(得分:0)

您不必转换为varchar

尝试这个

dtadmi BETWEEN CONVERT(DATETIME,'+''''+@dt_frm+'''''+' ) AND CONVERT(DATETIME,'+''''+@dt_to+''''+').....

where @dt_frm,@dt_to=storedprocedure parameter