TRY ... CATCH无法捕获异常-字符串到日期时间

时间:2018-07-05 14:23:30

标签: sql-server sql-server-2008 cursor try-catch

我必须从加载表中暂存一些数据,因为它是SQL Server2008。我不能使用TRY_CONVERT,而是用TRY...CATCH在游标中加载帮助程序表,以后我会使用过滤掉失败的转换:

declare @date varchar(255)
declare @id   varchar(255)

declare c cursor for
    select [ID],[DATE_OF_CREATION]  from dbo.LOAD_TABLE

open c

fetch next from c into @id, @date

while @@Fetch_status <> 0 
begin
    begin try 
        select convert(datetime, right(@date, 8))
    end try
    begin catch
        insert into #error_table(id) select @id
    end catch

    fetch next from c into @id,@date
end

close c
deallocate c

然后,当我尝试选择(或插入到暂存表中)有效数据(其ID不在#error_table中)时,它将失败。

select 
    [ID],
    convert(datetime, right([DATE_OF_CREATION], 8))  
from 
    dbo.LOAD_TABLE
where 
    [ID] not in (select [ID] from #error_table)

它失败并出现与未过滤出数据相同的错误

  

第241条消息,第16级,状态1,第3行
  从字符串转换日期和/或时间时转换失败。

关于这一切的最奇怪的部分是,如果我将上述选择作为我用于数据插入的新游标的一部分运行,它将失败(这是预期的),但在SQL Server 2017中不会失败? ?!!

因此它无法查询数据,但通过此选择成功执行了游标。

[编辑] 我发现了问题所在。在插入游标中 LOAD_TABLE与另一个事实表,显然先完成连接,然后再由错误表过滤。.为什么选择查询游标的执行计划不同于简单选择的执行计划仍然是个谜。

0 个答案:

没有答案