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