TRY ... CATCH не может перехватить исключение - строка в datetime - PullRequest
0 голосов
/ 05 июля 2018

Мне нужно подготовить некоторые данные из таблицы загрузки и, поскольку это SQL Server 2008. Я не могу использовать 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

Затем, когда я пытаюсь выбрать (или вставить в промежуточную таблицу) действительные данные (с идентификаторами, которые не находятся в #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 ?? ? !!

Таким образом, он не может запрашивать данные, но он успешно выполняет курсор с этим выбором.

[EDIT] Я выяснил, в чем проблема .. В курсоре вставки я присоединяюсь LOAD_TABLE с другой таблицей фактов, и, очевидно, сначала выполняется соединение, а затем фильтрация по таблице ошибок. До сих пор остается загадкой, почему план выполнения для курсора запроса select отличается от плана выполнения для простого выбора.

...