Ориентировочная дата кастинга в ЦКЛ - PullRequest
2 голосов
/ 16 марта 2010

Я ищу что-то вроде TRYCAST в TSQL или эквивалентный метод / хак.

В моем случае я извлекаю некоторые данные даты из столбца xml.

Следующий запрос выдает «Ошибка арифметического переполнения при преобразовании выражения в тип данных datetime». если часть данных, найденная в xml, не может быть преобразована в datetime (в данном конкретном случае, дата «0001-01-01» в некоторых случаях). Есть ли способ обнаружить это исключение до того, как оно произойдет?

select
      [CustomerInfo].value('(//*:InceptionDate/text())[1]', 'datetime')
  FROM Customers

Пример того, чего я пытаюсь достичь в псевдокоде с воображаемой функцией tsql TRYCAST(expr, totype, defaultvalue):

select
      TRYCAST(
       [CustomerInfo].value('(//*:InceptionDate/text())[1]', 'nvarchar(100)'), 
       datetime, 
       null)
  FROM Customers

1 Ответ

3 голосов
/ 16 марта 2010

Вы можете попытаться исключить узел, если он меньше минимально допустимого для SQL Server даты и времени:

SELECT
  [CustomerInfo].value('(//*:InceptionDate/text())[1][.>=''1753-01-01'']', 'datetime')
FROM 
  Customers

Менее предположительный способ сделать это будет:

SELECT
  CASE 
    WHEN ISDATE([CustomerInfo].value('(//*:InceptionDate/text())[1]'))
    THEN CONVERT(DATETIME, [CustomerInfo].value('(//*:InceptionDate/text())[1]'))
    ELSE NULL
  END
FROM 
  Customers
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...