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