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" 01.07.2008 3:39:30 "в тип данных int"
SELECT CONVERT(INT, CONVERT(VARCHAR, FileSize))
FROM dbo.myTable
WHERE ID = 111
Я абсолютно потерян, есть идеи, что может быть причиной этого?
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'
,