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