T-SQL: преобразование NTEXT в VARCHAR в INT/BIGINT

У меня есть таблица с полем типа NTEXT, в котором хранятся значения многих типов, в том числе размер файла. Я пытаюсь выполнить запрос к списку записей и добавить размеры файлов, но столкнулся с этой запутанной проблемой.

Поскольку NTEXT нельзя прямо/неявно преобразовать в INT или BIGINT, я сначала преобразую его в VARCHAR, а затем Я пытаюсь преобразовать его в INT или BIGINT. Все идет нормально, пока я не попытаюсь преобразовать значение VARCHAR в INT или BIGINT.

Вот мои запросы и результаты:

Сначала я пробую следующее, что не вызывает проблем, и результат равен 61069 (значение по-прежнему имеет тип ntext).

SELECT FileSize
FROM dbo.myTable
WHERE ID = 111

Теперь я конвертирую/привожу его как varchar, и снова без проблем. Вывод 61069 (теперь тип varchar).

SELECT CONVERT(VARCHAR, FileSize)
FROM dbo.myTable
WHERE ID = 111

Наконец, я пытаюсь преобразовать значение VARCHAR в BIGINT, чтобы выполнить SUM() и другие вычисления, но на этот раз я получаю сообщение «Ошибка преобразования типа данных varchar в bigint.».

SELECT CONVERT(BIGINT, CONVERT(VARCHAR, FileSize))
FROM dbo.myTable
WHERE ID = 111

И если я попытаюсь вместо этого преобразовать его в INT, я получаю сообщение «Ошибка преобразования при преобразовании значения varchar '7/1/2008 3:39:30 AM' в тип данных int"

SELECT CONVERT(INT, CONVERT(VARCHAR, FileSize))
FROM dbo.myTable
WHERE ID = 111

Я абсолютно потерян, есть идеи, что может быть причиной этого?


person sergeidave    schedule 11.02.2013    source источник
comment
@GSerg не фанат дубликатов. Он использует гораздо более общую проверку на ISNUMERIC, которая потенциально будет соответствовать большему количеству строк, а также потенциально идентифицирует значения, которые проходят проверку ISNUMERIC, но не могут быть преобразованы в INT. Попробуйте SELECT ISNUMERIC('5e6'); — теперь попробуйте преобразовать эту строку в INT. Другими словами, если этот пользователь использует тот ответ, он все равно может получить сообщение об ошибке. Это может хорошо работать для FLOAT, но могут быть и случаи, когда они не работают. Я бы поостерегся во многом полагаться на ISNUMERIC.   -  person Aaron Bertrand    schedule 11.02.2013


Ответы (1)


Вы не можете контролировать порядок применения предложения where и преобразований. В некоторых случаях SQL Server попытается выполнить преобразование строк, которые не прошли бы фильтр — все зависит от плана. Попробуйте это вместо этого:

SELECT CASE WHEN ID = 111 THEN 
  CONVERT(INT, CONVERT(VARCHAR(12), FileSize))
  -- don't be lazy, size ------^^ is important
  END
FROM dbo.myTable
WHERE ID = 111;

Также рассмотрите возможность использования целочисленного столбца для хранения целых чисел. Тогда в колонке FileSize не будет глупой ерунды вроде '7/1/2008 3:39:30 AM'.

person Aaron Bertrand    schedule 11.02.2013
comment
Потрясающие вещи! Это исправило мою проблему! Спасибо, Аарон!! - person sergeidave; 11.02.2013