Sql 得到一个;超出范围值“;关于varchar数据类型到datetime数据类型的转换

Sql 得到一个;超出范围值“;关于varchar数据类型到datetime数据类型的转换,sql,sql-server,sql-server-2008,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

存储过程执行将
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

这将帮助您查找包含非数字数据的记录:

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

DATETIME数据类型的日期范围为1753年1月1日至9999年12月31日。 因此,首先检查您要传递的日期是否在该日期范围内。还要检查您是否通过了无效日期,如4月31日等

您可以使用
print
功能打印正在形成的动态查询。
例如,
PRINT@SQL
您不必转换为
varchar

试试这个

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

where @dt_frm,@dt_to=storedprocedure parameter

你能从SP发布代码吗?你能发布代码而不是代码的屏幕截图吗?你能把你的答案格式化得更好一点吗?由于有额外的空格,这一切都作为代码呈现。