我必须从加载表中暂存一些数据,因为它是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与另一个事实表,显然先完成连接,然后再由错误表过滤。.为什么选择查询游标的执行计划不同于简单选择的执行计划仍然是个谜。