Детерминированный T-SQL INT Cast - PullRequest
3 голосов
/ 22 декабря 2011

Дано:

  • SQL Server
  • Таблица называется TEST_TABLE
  • Столбец в TEST_TABLE называется TEST_FIELD типа VARCHAR(50) NOT NULL
  • Ряд 1: 10YR3 / 6
  • Ряд 2: 10YR3 / 2
  • Запрос: SELECT TEST_FIELD FROM TEST_TABLE WHERE ...

Вопрос:

Вмое условие где мне нужно проверить значения в последнем символе строки.Я замечаю то же поведение, выполняя следующее в предложении Where:

  1. RIGHT(TEST_FIELD,1) > 3
  2. CAST(RIGHT(TEST_FIELD,1) AS INT) > 3

Они ведут себя одинаково в некоторыхпредполагаемое приведение в случае 1?Является ли случай 1 детерминированным?

Заранее спасибо.

Мэтт

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Преобразование выполняется при проверке значения, например:

DECLARE @t varchar(100)

SET @t = (SELECT 'ABCA2')

SELECT @t    

IF RIGHT(@t, 2) > 10
  SELECT 'Hi'
ELSE
  SELECT 'Bye'

Будет выдано сообщение об ошибке, поскольку SQL не может преобразовать A2 в целое число, не выдавая ошибку.

Однако, если вызамените @t на:

SET @t = (SELECT 'ABC12')

Приведенный выше код будет работать, если преобразование выполнено успешно и можно выполнить сравнение.Правильная функция сама не преобразует вашу ценность.MSDN явно указывает тип возвращаемого значения RIGHT():

Возвращает varchar, когда символьное выражение является символьным типом данных, отличным от Unicode.

Возвращает nvarchar, когда символьное выражение является символьным типом данных Unicode.

Чтобы упростить себе задачу, полностью исключите функцию RIGHT(), когда выполняется сравнение с текстом, например:

DECLARE @t varchar(100)

SET @t = (SELECT '1')

SELECT @t

IF @t < 10
  SELECT 'Hi'
ELSE
  SELECT 'Bye'

Обратите внимание, что я не звонилдо Right().Результатом вышеизложенного является отображение 1 и затем текста Hi.

0 голосов
/ 22 декабря 2011

И Да, случай 1 является детерминированным - либо успешное неявное преобразование из строки в целое число (конец, затем сравнение между двумя целыми числами), либо исключение.

...