Maybe type conversion error sql

Преобразование типов В реализациях языка SQL может быть выполнено неявное преобразование типов. Так, например, в T-SQL при сравнении или комбинировании значений типов smallint и int, данные типа smallint неявно преобразуются к типу int. Подробно о явном и неявном преобразовании типов в MS SQL Server можно прочитать в BOL. Пример. Вывести среднюю цену ПК-блокнотов с […]

Содержание

  1. Преобразование типов
  2. Оператор CASE
  3. Функции CAST и CONVERT (Transact-SQL)
  4. Синтаксис
  5. Аргументы
  6. expression
  7. data_type
  8. length
  9. style
  10. Типы возвращаемых данных
  11. Стили даты и времени
  12. Стили данных float и real
  13. Стили данных money и smallmoney
  14. Стили данных XML
  15. Стили двоичных данных
  16. Неявные преобразования
  17. Типы данных больших значений
  18. Тип данных XML
  19. Типы данных text и image
  20. Параметры сортировки выходных данных
  21. Усечение и округление результатов
  22. Некоторые преобразования типа данных даты и времени являются недетерминированными
  23. Дополнительные символы (суррогатные пары)
  24. Поддержка совместимости
  25. Примеры
  26. A. Используйте cast и convert.
  27. Б. Использование CAST с арифметическими операторами
  28. В. Использование CAST для объединения
  29. Г. Использование CAST для создания более удобочитаемого текста
  30. Д. Использование CAST с предложением LIKE
  31. Е. Использование convert или CAST с типизированным XML
  32. Ж. Использование CAST и CONVERT с данными даты и времени
  33. З. Использование convert с двоичными и символьными данными
  34. И. Преобразование типов данных даты и времени
  35. К. Использование функции CONVERT с данными даты и времени в разных форматах
  36. Л. Результат применения приоритета типов данных при допустимых преобразованиях
  37. Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
  38. М. Использование CAST и CONVERT
  39. Н. Использование CAST с арифметическими операторами
  40. О. Использование CAST с предложением LIKE
  41. П. Использование CAST и CONVERT с данными даты и времени

Преобразование типов

В реализациях языка SQL может быть выполнено неявное преобразование типов. Так, например, в T-SQL при сравнении или комбинировании значений типов smallint и int, данные типа smallint неявно преобразуются к типу int. Подробно о явном и неявном преобразовании типов в MS SQL Server можно прочитать в BOL.

Пример. Вывести среднюю цену ПК-блокнотов с предваряющим текстом «средняя цена = «.
Попытка выполнить запрос

SELECT ‘Средняя цена = ‘ + AVG(price) FROM laptop;

приведет к сообщению об ошибке

Implicit conversion from data type varchar to money is not allowed. Use the CONVERT function to run this query.

Это сообщение означает, что система не может выполнить неявное преобразование типа varchar к типу money. В подобных ситуациях может помочь явное преобразование типов. При этом, как указано в сообщении об ошибке, можно воспользоваться функцией CONVERT. Однако эта функция не стандартизована, поэтому в целях переносимости рекомендуется использовать стандартное выражение CAST. С него и начнем.
Если переписать наш запрос в виде

SELECT ‘Средняя цена = ‘ + CAST(AVG(price) AS CHAR(15)) FROM laptop;

в результате получим то, что требовалось:

Мы использовали выражение явного преобразования типов CAST для приведения среднего значения цены к строковому представлению. Синтаксис выражения CAST очень простой:

При этом следует иметь в виду, во-первых, что не любые преобразования типов возможны (стандарт содержит таблицу допустимых преобразований типов данных). Во-вторых, результат функции CAST для значения выражения, равного NULL, тоже будет NULL.
Рассмотрим еще один пример: определить средний год спуска на воду кораблей из таблицы Ships. Запрос

SELECT AVG(launched) FROM ships;

даст результат 1926. В принципе все правильно, т.к. мы получили в результате то, что просили — ГОД. Однако среднее арифметическое будет составлять примерно 1926,2381. Тут следует отметить, что агрегатные функции (за исключением функции COUNT, которая всегда возвращает целое число) наследуют тип данных обрабатываемых значений. Поскольку поле launched — целочисленное, мы и получили среднее значение с отброшенной дробной частью (заметьте — не округленное).
А если нас интересует результат с заданной точностью, скажем, до двух десятичных знаков? Применение выражения CAST к среднему значению ничего не даст по указанной выше причине. Действительно,

SELECT CAST(AVG(launched) AS NUMERIC(6,2)) FROM ships;

вернет значение 1926.00. Следовательно, CAST нужно применить к аргументу агрегатной функции:

SELECT AVG(CAST(launched AS NUMERIC(6,2))) FROM ships;

Результат — 1926.238095. Опять не то. Причина состоит в том, что при вычислении среднего значения было выполнено неявное преобразование типа. Сделаем еще один шаг:

SELECT CAST(AVG(CAST(launched AS NUMERIC(6,2))) AS NUMERIC(6,2)) FROM ships;

В результате получим то, что нужно — 1926.24. Однако это решение выглядит очень громоздко. Заставим неявное преобразование типа поработать на нас:

SELECT CAST(AVG(launched*1.0) AS NUMERIC(6,2)) FROM ships;

Т.е. мы использовали неявное преобразование целочисленного аргумента к точному числовому типу (EXACT NUMERIC), умножив его на вещественную единицу, после чего применили явное приведения типа результата агрегатной функции.

Аналогичные преобразования типа можно выполнить с помощью функции CONVERT:

SELECT CONVERT(NUMERIC(6,2),AVG(launched*1.0)) FROM ships;

Функция CONVERT имеет следующий синтаксис:

Основное отличие функции CONVERT от функции CAST состоит в том, что первая позволяет форматировать данные (например, темпоральные данные типа datetime) при преобразовании их к символьному типу и указывать формат при обратном преобразовании. Разные целочисленные значения необязательного аргумента стиль соответствуют определенным форматам. Рассмотрим следующий пример

SELECT CONVERT(char(25),CONVERT(datetime,’20030722′));

Здесь мы преобразуем строковое представление даты к типу datetime, после чего выполняем обратное преобразование, чтобы продемонстрировать результат форматирования. Поскольку значение аргумента стиль не задано, используется значение по умолчанию (0 или 100). В результате получим

Ниже приведены некоторые другие значения аргумента стиль и результат, полученный на приведенном выше примере. Заметим, что значения стиль большие 100 приводят к четырехзначному отображению года.

стиль формат
1 07/22/03
11 03/07/22
3 22/07/03
121 2003-07-22 00:00:00.000

Перечень всех возможных значений аргумента стиль можно посмотреть в BOL.

Оператор CASE

Пусть требуется вывести список всех моделей ПК с указанием их цены. При этом если модель отсутствует в продаже (нет в таблице РС), то вместо цены вывести текст: «Нет в наличии».
Список всех моделей ПК с ценами можно получить с помощью запроса:

SELECT DISTINCT product.model, price FROM product LEFT JOIN pc c
ON product.model=c.model
WHERE product.type=’pc’;

В результирующем наборе отсутствующая цена будет заменена NULL-значением:

model price
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 NULL
2112 NULL

Чтобы заменить NULL-значения нужным текстом, можно воспользоваться оператором CASE:

SELECT DISTINCT product.model,
CASE WHEN price IS NULL THEN ‘Нет в наличии’ ELSE CAST(price AS CHAR(20)) END price
FROM product LEFT JOIN pc c ON product.model=c.model
WHERE product.type=’pc’

Оператор CASE в зависимости от указанных условий возвращает одно из множества возможных значений. В нашем примере условием является проверка на NULL. Если это условие выполняется, то возвращается текст «Нет в наличии», в противном случае (ELSE) возвращается значение цены. Здесь есть один принципиальный момент. Поскольку результатом оператора SELECT всегда является таблица, то все значения любого столбца должны иметь один и тот же тип данных (с учетом неявного приведения типов). Поэтому мы не можем наряду с ценой (числовой тип) выводить символьную константу. Вот почему к полю price применяется преобразование типов, чтобы привести его значения к символьному представлению. В результате получим

model price
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 Нет в наличии
2112 Нет в наличии

Оператор CASE может быть использован в одной из двух синтаксических форм записи:

Все предложения WHEN должны иметь одинаковую синтаксическую форму, т.е. нельзя смешивать первую и вторую формы. При использовании первой синтаксической формы условие WHEN удовлетворяется, как только значение проверяемого выражения станет равным значению выражения, указанного в предложении WHEN. При использовании второй синтаксической формы условие WHEN удовлетворяется, как только предикат принимает значение TRUE. При удовлетворении условия оператор CASE возвращает значение, указанное в соответствующем предложении THEN. Если ни одно из условий WHEN не выполнилось, то будет использовано значение, указанное в предложении ELSE. При отсутствии ELSE, будет возвращено NULL-значение. Если удовлетворены несколько условий, то будет возвращено значение предложения THEN первого из них.
В приведенном выше примере была использована вторая форма оператора CASE.
Заметим, что для проверки на NULL стандарт предлагает более короткую форму оператора — COALESCE. Этот оператор имеет произвольное число параметров и возвращает значение первого, отличного от NULL. Для двух параметров оператор COALESCE(A, B) эквивалентен следующему оператору CASE:

Источник

Функции CAST и CONVERT (Transact-SQL)

Область применения: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Analytics Platform System (PDW)

Эти функции преобразуют выражение одного типа данных в другой.

Синтаксис

Соглашения о синтаксисе Transact-SQL

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

expression

data_type

Целевой тип данных. Это может быть xml, bigint и sql_variant. Типы данных псевдонимов нельзя использовать.

length

Указываемое дополнительно целое число, обозначающее длину целевого типа данных, который допускает указание длины пользователем. Значение по умолчанию — 30.

style

Целочисленное выражение, указывающее, как CONVERT функция будет переводить выражение. Для значения стиля NULL возвращается NULL. Аргумент data_type определяет диапазон.

Типы возвращаемых данных

Возвращает значение аргумента expression, преобразованное в тип data_type.

Стили даты и времени

Если аргумент expression принадлежит к типу данных даты или времени, аргумент style может иметь одно из значений, приведенных в таблице ниже. Другие значения обрабатываются как 0. Начиная с SQL Server 2012 (11.x), преобразование типов даты и времени в datetimeoffset поддерживается только для стилей 0 и 1. Все другие стили преобразования возвращают ошибку 9809.

SQL Server поддерживает формат даты в арабском стиле, используя кувейтский алгоритм.

Без века (гг) 1 С веком (гггг) Standard Входные и выходные данные 3
или 100 1,2 Значения по умолчанию для datetime и smalldatetime mon dd yyyy hh:miAM (или PM )
1 101 США 1 = mm/dd/yy
101 = mm/dd/yyyy
2 102 ANSI 2 = yy.mm.dd
102 = yyyy.mm.dd
3 103 Британский/французский 3 = dd/mm/yy
103 = dd/mm/yyyy
4 104 Немецкий 4 = dd.mm.yy
104 = dd.mm.yyyy
5 105 Итальянский 5 = dd-mm-yy
105 = dd-mm-yyyy
6 106 1 6 = dd mon yy
106 = dd mon yyyy
7 107 1 7 = Mon dd, yy
107 = Mon dd, yyyy
8 или 24 108 hh:mi:ss
9 или 109 1,2 По умолчанию + миллисекунды mon dd yyyy hh:mi:ss:mmmAM (или PM )
10 110 США 10 = мм-дд-гг
110 = mm-dd-yyyy
11 111 Япония 11 = гг/мм/дд
111 = yyyy/mm/dd
12 112 ISO 12 = ггммдд
112 = yyyymmdd
13 или 113 1,2 Европейский по умолчанию + миллисекунды dd mon yyyy hh:mi:ss:mmm (24 часа)
14 114 hh:mi:ss:mmm (24 часа)
20 или 120 2 Канонический формат ODBC yyyy-mm-dd hh:mi:ss (24 часа)
21 , 25 или 121 2 Канонический ODBC (с миллисекундами) по умолчанию для времени, даты, даты и времени2 и datetimeoffset yyyy-mm-dd hh:mi:ss.mmm (24 часа)
22 США mm/dd/yy hh:mi:ss AM (или PM )
23 ISO8601 yyyy-mm-dd
126 4 ISO8601 yyyy-mm-ddThh:mi:ss.mmm (без пробелов) 6
127 8, 9 ISO8601 с часовой поясом Z yyyy-MM-ddThh:mm:ss.fffZ (без пробелов) 6
130 1,2 Хиджра 5 dd mon yyyy hh:mi:ss:mmmAM 7
131 2 Хиджра 5 dd/mm/yyyy hh:mi:ss:mmmAM

1 Эти значения стилей возвращают недетерминированные результаты. Включает все стили () ( yy без века) и подмножество стилей () ( yyyy с веками).

2 Значения по умолчанию ( или 100, 9 или 109, 13 или 113, 20 или 120, 23 и 21 , 25 или 121) всегда возвращают век ( yyyy ).

По умолчанию SQL Server интерпретирует двузначные значения года с пороговым значением 2049. Это означает, что SQL Server интерпретирует двухзначное значение года 49 как 2049, а двухзначное значение 50 — как 1950. В большинстве клиентских приложений, основанных, в частности, на объектах автоматизации, 2030 год используется в качестве порогового значения. SQL Server предоставляет параметр настройки двузначного порогового значения года, с помощью которого можно изменить пороговое значение года, используемое в SQL Server. Это позволяет обеспечить согласованную обработку дат. Рекомендуется использовать четырехзначные года.

3 Вход при преобразовании в тип datetime; выход при преобразовании в символьные данные.

4 Для использования в формате XML. Для преобразования из datetime или smalldatetime в символьные данные формат вывода должен быть таким, как описано в предыдущей таблице.

5 Хиджра — календарная система с несколькими вариантами. В SQL Server используется кувейтский алгоритм.

6 Для значения миллисекунда ( mmm ) 0 значение десятичной дроби миллисекунда не отображается. Например, значение 2022-11-07T18:26:20.000 отображается как 2022-11-07T18:26:20 .

7 В этом стиле mon представляет представление юникода хиджры с несколькими токенами полного названия месяца. Это значение не отображается правильно при установке SSMS по умолчанию в США.

8 Поддерживается только при приведение символьных данных к datetime или smalldatetime. При приведение символьных данных, представляющих только компоненты даты или времени, к типам данных datetime или smalldatetime , неуказанным компонентом времени присваивается 00:00:00.000 значение , а неуказанным компонентам даты — значение 1900-01-01 .

9 Используйте необязательный индикатор Z часового пояса, чтобы упростить сопоставление значений даты и времени XML, имеющих сведения о часовом поясе, с SQL Server значениями даты и времени без часового пояса. Z указывает часовой пояс в формате UTC-0. Смещение HH:MM в + направлении или — указывает другие часовые пояса. Например: 2022-12-12T23:45:12-08:00 .

При преобразовании в символьные данные из smalldatetime стили, включающие секунды или миллисекунды, будут содержать нули в соответствующих позициях. При преобразовании из datetime или smalldatetime ненужные части даты можно усекать с помощью типа данных char или varchar соответствующей длины.

При преобразовании в тип данных datetimeoffset из символьных данных со стилем, включающим время, смещение часового пояса добавляется к результату.

Стили данных float и real

Если аргумент expression принадлежит к типу данных float или real, аргумент style может иметь одно из значений, приведенных в таблице ниже. Другие значения обрабатываются как 0.

Значение Выходные данные
(по умолчанию) Не более 6 разрядов. По необходимости используется экспоненциальное представление чисел.
1 Всегда 8 разрядов. Всегда используется экспоненциальное представление чисел.
2 Всегда 16 разрядов. Всегда используется экспоненциальное представление чисел.
3 Всегда 17 разрядов. Используется для преобразования без потери данных. При использовании этого стиля каждое отдельное значение типа float или real гарантированно преобразуется в отдельную строку символов.

Применимо к: SQL Server 2016 (13.x) и более поздних версий, а также Azure SQL Database.

126, 128, 129 Включено по устаревшим причинам. Не используйте эти значения для новой разработки.

Стили данных money и smallmoney

Если аргумент expression принадлежит к типу данных money или smallmoney, аргумент style может иметь одно из значений, приведенных в таблице ниже. Другие значения обрабатываются как 0.

Значение Выходные данные
(по умолчанию) Без запятых, разделяющих группы разрядов, с двумя цифрами справа от десятичного разделителя.

Пример 4235.98.

1 Запятые, разделяющие группы из трех разрядов слева от десятичного разделителя, с двумя цифрами справа от десятичного разделителя.

Пример 3,510.92.

2 Без запятых, разделяющих группы разрядов, с четырьмя цифрами справа от десятичного разделителя.

Пример 4235.9819.

126 Эквивалент стиля 2 при преобразовании в char(n) или varchar(n)

Стили данных XML

Если аргумент expression принадлежит к типу данных xml, аргумент style может иметь одно из значений, приведенных в таблице ниже. Другие значения обрабатываются как 0.

Значение Выходные данные
(по умолчанию) Используйте поведение синтаксического анализа по умолчанию, которое удаляет незначительные пробелы и не разрешает внутреннее подмножество DTD.

Примечание. При преобразовании в тип данных xmlSQL Server обрабатывает незначащие пробелы не так, как это описано в стандарте XML 1.0. Дополнительные сведения см. в статье Создание экземпляров XML-данных.

1 Сохранять незначащие пробельные символы. Этот параметр стиля задает обработку по умолчанию xml:space в соответствии с поведением xml:space=»preserve» .
2 Использовать ограниченную обработку внутреннего подмножества DTD.

При этом для выполнения операций синтаксического анализа без проверки действительности сервер может пользоваться следующей информацией, предоставляемой внутренним подмножеством DTD.

— Применяются атрибуты по умолчанию.
— Ссылки на внутренние сущности разрешаются и раскрываются.
— Проверяется синтаксическая правильность модели содержимого DTD.

Синтаксический анализатор пропускает внешние подмножества DTD. Кроме того, он не оценивает XML-объявление, чтобы определить, имеет ли автономный атрибут значение «да » или «нет «. Вместо этого выполняется анализ экземпляра XML как отдельного документа.

3 Сохранять незначащие пробельные символы и использовать ограниченную обработку внутреннего подмножества DTD.

Стили двоичных данных

Для выражения binary(n), char(n), varbinary(n) или varchar(n)expressionстиль может иметь одно из значений, показанных в следующей таблице. При использовании значений стиля, отсутствующих в этой таблице, возвращается ошибка.

Значение Выходные данные
(по умолчанию) Преобразует символы ASCII в двоичные байты либо двоичные байты в символы ASCII. Каждый символ или байт преобразуется в соотношении 1:1.

Если параметр data_type имеет значение binary, к результату слева добавляются символы 0x.

1, 2 Если параметр data_type имеет значение binary, выражение должно быть символьным. Значение аргумента expression должно состоять из четного числа шестнадцатеричных знаков (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, a, b, c, d, e, f). Если аргумент style имеет значение 1, в качестве первых двух символов выражения обязательно использовать 0x. Если выражение содержит нечетное число символов или использованы недопустимые символы, возникает ошибка.

Если длина преобразованного выражения превышает длину типа данных data_type, результат усекается справа.

При использовании значений аргумента data_type фиксированной длины, превышающей длину преобразованного результата, к результату справа добавляются нули.

Аргумент data_type символьного типа требует двоичного выражения. Каждый двоичный символ преобразуется в два шестнадцатеричных символа. Предположим, длина преобразованного выражения превышает длину типа данных data_type. В этом случае оно усекается.

Если для параметра data_type используется значение символьного типа фиксированного размера и длина преобразованного результата меньше длины типа данных data_type, к преобразованному выражению справа добавляются символы пробела, чтобы сохранить четность числа шестнадцатеричных знаков.

Символы 0x не добавляются слева от преобразованного результата для стиля 2.

Неявные преобразования

Для неявных преобразований не требуется спецификация CAST функции или CONVERT функции. Для явных преобразований требуется спецификация CAST функции или CONVERT функции . На следующей иллюстрации показаны все явные и неявные преобразования типов данных, допустимые для системных типов данных SQL Server. Это могут быть типы bigint, sql_variant и xml. При присваивании неявного преобразования из типа sql_variant не происходит, но неявное преобразование в тип sql_variant производится.

В Центре загрузки Майкрософт эта диаграмма представлена в виде PNG-файла, который можно скачать.

На приведенной выше диаграмме показаны все явные и неявные преобразования, которые допускаются в SQL Server, однако результирующий тип данных преобразования зависит от выполняемой операции.

  • При явных преобразованиях сам оператор определяет результирующий тип данных.
  • При неявных преобразованиях операторы назначения, такие как установка значения переменной или вставка значения в столбец, дают в результате тип данных, определенный в объявлении переменной или в определении столбца.
  • Для операторов сравнения или других выражений результирующий тип данных зависит от правил приоритета типов данных.

Практический пример применения приоритета типов данных при преобразованиях приводится далее в этом разделе.

При преобразовании между типом datetimeoffset и типами символов char, nchar, nvarchar и varchar преобразованная часть смещения часового пояса всегда должна иметь двойные цифры для и HH MM . Например, -08:00 .

Так как у данных в Юникоде всегда четное число байтов, будьте осторожны при преобразовании значений типа binary или varbinary в типы данных, поддерживающие Юникод, и наоборот. Например, следующее преобразование не возвращает шестнадцатеричное значение 41. Он возвращает шестнадцатеричное значение 4100:

Дополнительные сведения см. в статье Collation and Unicode Support.

Типы данных больших значений

Типы данных большого объема демонстрируют то же поведение при явных и неявных преобразованиях, что и их аналоги меньшего объема, а именно типы данных nvarchar, varbinary и varchar. Тем не менее необходимо учитывать следующие правила:

  • Преобразование из image в varbinary(max) и обратно неявное, как и преобразования между text и varchar(max) , а также ntext и nvarchar(max) .
  • Преобразование из типов данных большого объема, например varchar(max) , в аналогичный тип данных меньшего объема, например varchar, неявное, но если объем данных слишком велик, будет произведено усечение данных до указанной длины конкретного типа данных меньшего объема.
  • Преобразование из nvarchar, varbinary или varchar в соответствующие им типы данных большого объема выполняется неявно.
  • Преобразование из типа данных sql_variant в типы данных большого объема выполняется явно.
  • Типы данных с большими значениями нельзя преобразовать в тип данных sql_variant .

Дополнительные сведения о преобразовании из типа данных xml см. в разделе Создание экземпляров XML-данных.

Тип данных XML

При явном или неявном приведении типа данных xml к строковому или двоичному типу данных содержимое типа данных xml сериализуется согласно набору определенных правил. Сведения об этих правилах см. в разделе Определение сериализации XML-данных. Дополнительные сведения о преобразовании других типов данных в тип данных xml см. в разделе Создание экземпляров XML-данных.

Типы данных text и image

Типы данных text и image не поддерживают автоматическое преобразование типов данных. Можно явно преобразовать text в символьные данные, а image — в binary или varbinary, но длиной не более 8000 байт. Если вы попробуете произвести неверное преобразование, например преобразовать символьное выражение, содержащее буквы, в int, SQL Server вернет ошибку.

Параметры сортировки выходных данных

CAST Когда функции или CONVERT выводят символьную строку и получают входные данные символьной строки, выходные данные имеют те же параметры сортировки и метки параметров сортировки, что и входные данные. Если входные данные не является символьной строкой, выходные данные имеют параметры сортировки по умолчанию для базы данных и метку параметров сортировки с принудительным значением по умолчанию. Дополнительные сведения см. в разделе Очередность параметров сортировки (Transact-SQL).

Чтобы назначить выходным данным другие параметры сортировки, примените предложение COLLATE к результирующем выражению CAST функции или CONVERT . Пример:

Усечение и округление результатов

При преобразовании символьных или двоичных выражений (binary, char, nchar, nvarchar, varbinary или varchar) в выражение другого типа данных операция преобразования может усекать выходные данные, отображать их лишь частично или возвращать ошибку. Это происходит в тех случаях, когда результат имеет слишком малую длину для отображения. Результаты преобразований в binary, char, nchar, nvarchar, varbinary или varchar усекаются всегда, за исключением случаев, перечисленных в таблице ниже.

Из типа данных В тип данных Результат
int, smallint или tinyint char
varchar
Слишком короткий для отображения
nchar
nvarchar
Ошибка 1
money, smallmoney, numeric, decimal, float или real char
varchar
Ошибка 1
nchar
nvarchar
Ошибка 1

1 Возвращена ошибка, так как длина результата слишком коротка для отображения.

SQL Server гарантирует получение одинаковых результатов в разных версиях только для обратимых преобразований, то есть таких, когда данные преобразуются из исходного типа данных, а затем опять в него. В следующем примере показано обратимое преобразование:

Не создавайте двоичные значения, а затем преобразуйте их в тип данных категории числового типа данных. SQL Server не гарантирует, что результат преобразования типа данных decimal или numeric в binary будет одинаковым в разных версиях SQL Server.

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

При преобразовании между типами данных с разными длинами дробных частей SQL Server может усекать или округлять результат. В следующей таблице описано это поведение.

От Чтобы Поведение
numeric numeric Round
numeric int Truncate
numeric money Round
money int Round
money numeric Round
float int Truncate
float numeric Раунд 1
float datetime Round
datetime int Round

1 Преобразование значений с плавающей точкой с научной нотацией в десятичное или числовое значение ограничено значениями только с точностью 17 цифр. Любое значение с точностью, превышающей 17 знаков, округляется до нуля.

Например, значения 10,6496 и –10,6496 могут усекаться или округляться при преобразовании в тип int или numeric:

Результаты запроса показаны в приведенной ниже таблице.

trunc1 trunc2 round1 round2
10 –10 11 -11

При преобразовании к типам данных, у которых дробная часть короче, чем у исходного типа, значение округляется. Например, это преобразование возвращает $10.3497 :

SQL Server возвращает сообщение об ошибке при попытке преобразовать нечисловые данные типа char, nchar, nvarchar или varchar в тип decimal, float, int или numeric. SQL Server также возвращает сообщение об ошибке при попытке преобразования пустой строки (» «) в тип numeric или decimal.

Некоторые преобразования типа данных даты и времени являются недетерминированными

В следующих стилях преобразование строк в тип datetime недетерминировано:

1 За исключением стилей 20 и 21.

Дополнительные символы (суррогатные пары)

Начиная с SQL Server 2012 (11.x) при использовании параметров сортировки дополнительных символов CAST (SC) операция из nchar или nvarchar в тип nchar или nvarchar меньшей длины не усекается внутри суррогатной пары. Вместо этого усечение происходит перед дополнительным символом. Например, выполнение следующего фрагмента кода приведет к тому, что в @x останется лишь ‘ab’ . Недостаточно места для хранения дополнительного символа.

При использовании параметров сортировки SC поведение CONVERT аналогично CAST . Дополнительные сведения см. в статье Поддержка параметров сортировки и Юникода — дополнительные символы.

Поддержка совместимости

В более ранних версиях SQL Server по CAST умолчанию для операций с CONVERT типами данных time и datetime2 использовался 121, за исключением случаев, когда в выражении вычисляемого столбца используется любой из типов. Для вычисляемых столбцов используемый по умолчанию стиль — 0. Это поведение влияет на вычисляемые столбцы при их создании и использовании в запросах с автоматической параметризацией, а также при использовании в определениях ограничений.

При уровне совместимости 110 и выше CAST операции и CONVERT для типов данных time и datetime2 всегда имеют 121 в качестве стиля по умолчанию. Если запрос основан на прежнем поведении, следует использовать уровень совместимости ниже 110 либо явно задать в затрагиваемом запросе стиль 0.

Значение уровня совместимости Стиль по умолчанию для CAST и CONVERT 1 Стиль по умолчанию для вычисляемого столбца
= 110 121 121

1 Кроме вычисляемых столбцов

Обновление базы данных до уровня совместимости 110 и выше не приведет к изменению пользовательских данных, сохраненных на диске. Следует исправить эти данных соответствующим образом вручную. Например, если бы вы использовали предложение SELECT INTO для создания таблицы на основе источника, содержащего описанное выше выражение вычисляемого столбца, то сохранялись бы данные (благодаря стилю 0), а не само определение вычисляемого столбца. В таком случае необходимо вручную обновлять эти данные в соответствии со стилем 121.

Примеры

A. Используйте cast и convert.

В этих примерах извлекается название продукта для тех продуктов, которые имеют в 3 качестве первой цифры прейскуранта, и их значения преобразуются ListPrice в int.

Используйте CAST в следующих случаях:

Используйте CONVERT в следующих случаях:

Результирующий набор: Пример результирующих наборов одинаков как для , так CAST и CONVERT для .

Б. Использование CAST с арифметическими операторами

В этом примере вычисляется столбец значений ( Computed ) путем деления суммарных продаж за год ( SalesYTD ) на проценты комиссионных ( CommissionPCT ). Это значение округляется до ближайшего целого числа, а затем CAST — до типа данных int .

В. Использование CAST для объединения

В этом примере выражения, не являющиеся символами, объединяются с помощью CAST . В нем используется база данных AdventureWorksDW2019 .

Г. Использование CAST для создания более удобочитаемого текста

В этом примере используется CAST в списке SELECT для преобразования столбца Name в столбец char(10). В нем используется база данных AdventureWorksDW2019 .

Д. Использование CAST с предложением LIKE

В этом примере значения столбца SalesYTD преобразуются money в тип данных int, а затем в тип данных char(20), чтобы его можно было использовать в LIKE предложении .

Е. Использование convert или CAST с типизированным XML

В этих примерах показано использование CONVERT для преобразования данных в типизированный XML с помощью типа данных и столбцов XML (SQL Server).

В этом примере строка, содержащая пробельные символы, текст и разметку, преобразуется в типизированный XML, в котором удаляются все незначащие пробельные символы (пробелы, разделяющие узлы):

В этом примере похожая строка, содержащая пробельные символы, текст и разметку, преобразуется в типизированный XML, в котором сохраняются все незначащие пробельные символы (пробелы, разделяющие узлы):

В этом примере строка, содержащая пробельные символы, текст и разметку, приводится к типизированному XML:

Дополнительные примеры см. в статье Создание экземпляров XML-данных.

Ж. Использование CAST и CONVERT с данными даты и времени

Начиная со значений GETDATE() этот пример показывает текущие дату и время, использует функцию CAST для изменения текущей даты и времени в символьный тип данных и затем использует CONVERT для отображения даты и времени в формате ISO 8601 .

Этот пример — частичная противоположность предыдущему примеру. В этом примере в качестве символьных данных отображается дата и время, используется CAST для изменения символьных данных на тип данных datetime , а затем используется CONVERT для изменения символьных данных на тип данных datetime .

З. Использование convert с двоичными и символьными данными

В этих примерах показаны результаты преобразования двоичных и символьных данных с использованием различных стилей.

В этом примере показано, что стиль 1 может привести к принудительному усечению результата. К этому приводит наличие символов 0x в результате.

В этом примере показано, что стиль 2 не усекает результат, так как результат не содержит символов 0x.

Преобразуйте символьное значение «Name» в двоичное значение.

И. Преобразование типов данных даты и времени

В этом примере показано преобразование типов данных date, time и datetime .

При рассмотрении преобразования значений из даты в datetime или datetime2 убедитесь, что значения находятся в пределах совместимого диапазона. Минимальное значение года для datetime — 1753 , а минимальное значение года — 0001 для date и datetime2.

К. Использование функции CONVERT с данными даты и времени в разных форматах

Начиная со значений GETDATE() этот пример использует функцию CONVERT для отображения всех стилей даты и времени в разделе Стили даты и времени этой статьи.

Номер формата Пример запроса Пример результата
SELECT CONVERT(NVARCHAR, GETDATE(), 0) 23 авг 2019 13:39
1 SELECT CONVERT(NVARCHAR, GETDATE(), 1) 08/23/19
2 SELECT CONVERT(NVARCHAR, GETDATE(), 2) 19.08.23
3 SELECT CONVERT(NVARCHAR, GETDATE(), 3) 23/08/19
4 SELECT CONVERT(NVARCHAR, GETDATE(), 4) 23.08.19
5 SELECT CONVERT(NVARCHAR, GETDATE(), 5) 23-08-19
6 SELECT CONVERT(NVARCHAR, GETDATE(), 6) 23 авг 19
7 SELECT CONVERT(NVARCHAR, GETDATE(), 7) Авг 23, 19
8 или 24 или 108 SELECT CONVERT(NVARCHAR, GETDATE(), 8) 13:39:17
9 или 109 SELECT CONVERT(NVARCHAR, GETDATE(), 9) 23 авг 2019 13:39:17:090
10 SELECT CONVERT(NVARCHAR, GETDATE(), 10) 08-23-19
11 SELECT CONVERT(NVARCHAR, GETDATE(), 11) 19/08/23
12 SELECT CONVERT(NVARCHAR, GETDATE(), 12) 190823
13 или 113 SELECT CONVERT(NVARCHAR, GETDATE(), 13) 23 авг 2019 13:39:17:090
14 или 114 SELECT CONVERT(NVARCHAR, GETDATE(), 14) 13:39:17:090
20 или 120 SELECT CONVERT(NVARCHAR, GETDATE(), 20) 2019-08-23 13:39:17
21 или 25 или 121 SELECT CONVERT(NVARCHAR, GETDATE(), 21) 2019-08-23 13:39:17.090
22 SELECT CONVERT(NVARCHAR, GETDATE(), 22) 23/08/19 13:39:17
23 SELECT CONVERT(NVARCHAR, GETDATE(), 23) 2019-08-23
101 SELECT CONVERT(NVARCHAR, GETDATE(), 101) 08/23/2019
102 SELECT CONVERT(NVARCHAR, GETDATE(), 102) 2019.08.23
103 SELECT CONVERT(NVARCHAR, GETDATE(), 103) 23/08/2019
104 SELECT CONVERT(NVARCHAR, GETDATE(), 104) 23.08.2019
105 SELECT CONVERT(NVARCHAR, GETDATE(), 105) 23-08-2019
106 SELECT CONVERT(NVARCHAR, GETDATE(), 106) 23 авг 2019
107 SELECT CONVERT(NVARCHAR, GETDATE(), 107) Авг 23, 2019
110 SELECT CONVERT(NVARCHAR, GETDATE(), 110) 08-23-2019
111 SELECT CONVERT(NVARCHAR, GETDATE(), 111) 2019/08/23
112 SELECT CONVERT(NVARCHAR, GETDATE(), 112) 20190823
113 SELECT CONVERT(NVARCHAR, GETDATE(), 113) 23 авг 2019 13:39:17.090
120 SELECT CONVERT(NVARCHAR, GETDATE(), 120) 2019-08-23 13:39:17
121 SELECT CONVERT(NVARCHAR, GETDATE(), 121) 2019-08-23 13:39:17.090
126 SELECT CONVERT(NVARCHAR, GETDATE(), 126) 2019-08-23T13:39:17.09
127 SELECT CONVERT(NVARCHAR, GETDATE(), 127) 2019-08-23T13:39:17.09
130 SELECT CONVERT(NVARCHAR, GETDATE(), 130) 22 ذو الحجة 1440 1:39:17.090P
131 SELECT CONVERT(NVARCHAR, GETDATE(), 131) 22/12/1440 13:39:17.090

Л. Результат применения приоритета типов данных при допустимых преобразованиях

В следующем примере определяется переменная типа varchar(10), присваивается целочисленное значение переменной, а затем выбирается объединение переменной со строкой.

Значение int , равное 1, было преобразовано в varchar.

В этом примере показан аналогичный запрос с использованием переменной int :

В этом случае инструкция SELECT выдает следующую ошибку:

Чтобы вычислить выражение @notastring + ‘ is not a string.’ , SQL Server необходимо следовать правилам приоритета типов данных для выполнения неявного преобразования перед вычислением результата выражения. Так как значение int имеет более высокий приоритет, чем varchar, SQL Server пытается преобразовать строку в целое число и завершается сбоем, так как эту строку нельзя преобразовать в целое число.

Если предоставить строку, которую можно преобразовать, инструкция завершается успешно, как показано в следующем примере:

В этом случае строка ‘1’ может быть преобразована в целочисленное значение 1, поэтому инструкция SELECT возвращает значение 2. Если предоставленные типы данных являются целочисленными, оператор + становится математическим оператором сложения, а не объединения строк.

Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)

М. Использование CAST и CONVERT

В этом примере извлекаются имена продуктов, у которых первая цифра цены — 3 , а затем их значения ListPrice преобразовываются в int. В нем используется база данных AdventureWorksDW2019 .

В этом примере показан тот же запрос с использованием CONVERT вместо CAST . В нем используется база данных AdventureWorksDW2019 .

Н. Использование CAST с арифметическими операторами

В этом примере вычисляется отдельное значение столбца путем деления цены единицы товара ( UnitPrice ) на процент скидки ( UnitPriceDiscountPct ). Затем этот результат округляется до ближайшего целого числа и, наконец, преобразуется в тип данных int . В этом примере используется база данных AdventureWorksDW2019 .

О. Использование CAST с предложением LIKE

В этом примере столбец ListPrice типа money преобразуется в тип int, а затем в тип char(20) так, чтобы его можно было использовать в предложении LIKE. В этом примере используется база данных AdventureWorksDW2019 .

П. Использование CAST и CONVERT с данными даты и времени

В этом примере отображаются текущие дата и время, используется CAST для изменения текущей даты и времени на символьный тип данных и, наконец, используется CONVERT отображение даты и времени в формате ISO 8601. В этом примере используется база данных AdventureWorksDW2019 .

Этот пример — частичная противоположность предыдущему примеру. В этом примере в качестве символьных данных отображается дата и время, используется CAST для изменения символьных данных на тип данных datetime , а затем используется CONVERT для изменения символьных данных на тип данных datetime . В этом примере используется база данных AdventureWorksDW2019 .

Источник

SQL: Ошибка при преобразовании типа данных nvarchar во float

Я хочу преобразовать данные nvarchar в тип float .

В моем случае у меня есть столбец SalesValue , и я использовал эту команду

Моя таблица имеет такие значения, как

Но я получаю ошибку

SQL: Ошибка при преобразовании типа данных nvarchar в float.

Как я могу решить эту проблему ?

4 ответа

1-е приведение значения с помощью запроса ниже, а затем обновите нормально

Это приблизит вас к ISNUMERIC()

Вы должны найти значения, которые не совпадают. В SQL Server 2012+ вы можете использовать try_convert() . Это не доступно. Так как насчет этого?

Я думаю, что это покрывает очевидные нарушения: символ, который не является числовым или двумя (или более) десятичными точками.

Похоже, что у вас все еще есть не числовые данные. Я надеюсь, что ваша сторона приложения проделала довольно хорошую работу по очистке ваших данных перед вводом, и проблема, вероятно, в том, что у вас есть «$» в одном или нескольких ваших полях. Преобразование завершится неудачно, когда у вас будет не числовой символ, отличный от ‘.’ в нем (как вы, вероятно, знаете, именно поэтому вы удалили ‘,’). Я запустил приведенный ниже скрипт, чтобы проверить это.

Вы можете попробовать запустить приведенный ниже скрипт для рассматриваемого столбца, чтобы увидеть, с какими столбцами у вас возникла проблема:

Таким образом, ваше исправление будет состоять в том, чтобы просто изменить предоставленную вами строку:

Если вы не нашли другие символы в результатах предыдущего сценария.

Источник

Преобразование типов

В реализациях языка SQL может быть выполнено неявное преобразование типов. Так, например, в T-SQL при сравнении или комбинировании значений типов smallint и int, данные типа smallint неявно преобразуются к типу int. Подробно о явном и неявном преобразовании типов в MS SQL Server можно прочитать в BOL.

Пример. Вывести среднюю цену ПК-блокнотов с предваряющим текстом «средняя цена = «.
Попытка выполнить запрос

SELECT ‘Средняя цена = ‘ + AVG(price) FROM laptop;

приведет к сообщению об ошибке

Implicit conversion from data type varchar to money is not allowed. Use the CONVERT function to run this query.

Это сообщение означает, что система не может выполнить неявное преобразование типа varchar к типу money. В подобных ситуациях может помочь явное преобразование типов. При этом, как указано в сообщении об ошибке, можно воспользоваться функцией CONVERT. Однако эта функция не стандартизована, поэтому в целях переносимости рекомендуется использовать стандартное выражение CAST. С него и начнем.
Если переписать наш запрос в виде

SELECT ‘Средняя цена = ‘ + CAST(AVG(price) AS CHAR(15)) FROM laptop;

в результате получим то, что требовалось:

Мы использовали выражение явного преобразования типов CAST для приведения среднего значения цены к строковому представлению. Синтаксис выражения CAST очень простой:

При этом следует иметь в виду, во-первых, что не любые преобразования типов возможны (стандарт содержит таблицу допустимых преобразований типов данных). Во-вторых, результат функции CAST для значения выражения, равного NULL, тоже будет NULL.
Рассмотрим еще один пример: определить средний год спуска на воду кораблей из таблицы Ships. Запрос

SELECT AVG(launched) FROM ships;

даст результат 1926. В принципе все правильно, т.к. мы получили в результате то, что просили — ГОД. Однако среднее арифметическое будет составлять примерно 1926,2381. Тут следует отметить, что агрегатные функции (за исключением функции COUNT, которая всегда возвращает целое число) наследуют тип данных обрабатываемых значений. Поскольку поле launched — целочисленное, мы и получили среднее значение с отброшенной дробной частью (заметьте — не округленное).
А если нас интересует результат с заданной точностью, скажем, до двух десятичных знаков? Применение выражения CAST к среднему значению ничего не даст по указанной выше причине. Действительно,

SELECT CAST(AVG(launched) AS NUMERIC(6,2)) FROM ships;

вернет значение 1926.00. Следовательно, CAST нужно применить к аргументу агрегатной функции:

SELECT AVG(CAST(launched AS NUMERIC(6,2))) FROM ships;

Результат — 1926.238095. Опять не то. Причина состоит в том, что при вычислении среднего значения было выполнено неявное преобразование типа. Сделаем еще один шаг:

SELECT CAST(AVG(CAST(launched AS NUMERIC(6,2))) AS NUMERIC(6,2)) FROM ships;

В результате получим то, что нужно — 1926.24. Однако это решение выглядит очень громоздко. Заставим неявное преобразование типа поработать на нас:

SELECT CAST(AVG(launched*1.0) AS NUMERIC(6,2)) FROM ships;

Т.е. мы использовали неявное преобразование целочисленного аргумента к точному числовому типу (EXACT NUMERIC), умножив его на вещественную единицу, после чего применили явное приведения типа результата агрегатной функции.

Аналогичные преобразования типа можно выполнить с помощью функции CONVERT:

SELECT CONVERT(NUMERIC(6,2),AVG(launched*1.0)) FROM ships;

Функция CONVERT имеет следующий синтаксис:

Основное отличие функции CONVERT от функции CAST состоит в том, что первая позволяет форматировать данные (например, темпоральные данные типа datetime) при преобразовании их к символьному типу и указывать формат при обратном преобразовании. Разные целочисленные значения необязательного аргумента стиль соответствуют определенным форматам. Рассмотрим следующий пример

SELECT CONVERT(char(25),CONVERT(datetime,’20030722′));

Здесь мы преобразуем строковое представление даты к типу datetime, после чего выполняем обратное преобразование, чтобы продемонстрировать результат форматирования. Поскольку значение аргумента стиль не задано, используется значение по умолчанию (0 или 100). В результате получим

Ниже приведены некоторые другие значения аргумента стиль и результат, полученный на приведенном выше примере. Заметим, что значения стиль большие 100 приводят к четырехзначному отображению года.

стиль формат
1 07/22/03
11 03/07/22
3 22/07/03
121 2003-07-22 00:00:00.000

Перечень всех возможных значений аргумента стиль можно посмотреть в BOL.

Оператор CASE

Пусть требуется вывести список всех моделей ПК с указанием их цены. При этом если модель отсутствует в продаже (нет в таблице РС), то вместо цены вывести текст: «Нет в наличии».
Список всех моделей ПК с ценами можно получить с помощью запроса:

SELECT DISTINCT product.model, price FROM product LEFT JOIN pc c
ON product.model=c.model
WHERE product.type=’pc’;

В результирующем наборе отсутствующая цена будет заменена NULL-значением:

model price
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 NULL
2112 NULL

Чтобы заменить NULL-значения нужным текстом, можно воспользоваться оператором CASE:

SELECT DISTINCT product.model,
CASE WHEN price IS NULL THEN ‘Нет в наличии’ ELSE CAST(price AS CHAR(20)) END price
FROM product LEFT JOIN pc c ON product.model=c.model
WHERE product.type=’pc’

Оператор CASE в зависимости от указанных условий возвращает одно из множества возможных значений. В нашем примере условием является проверка на NULL. Если это условие выполняется, то возвращается текст «Нет в наличии», в противном случае (ELSE) возвращается значение цены. Здесь есть один принципиальный момент. Поскольку результатом оператора SELECT всегда является таблица, то все значения любого столбца должны иметь один и тот же тип данных (с учетом неявного приведения типов). Поэтому мы не можем наряду с ценой (числовой тип) выводить символьную константу. Вот почему к полю price применяется преобразование типов, чтобы привести его значения к символьному представлению. В результате получим

model price
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 Нет в наличии
2112 Нет в наличии

Оператор CASE может быть использован в одной из двух синтаксических форм записи:

Все предложения WHEN должны иметь одинаковую синтаксическую форму, т.е. нельзя смешивать первую и вторую формы. При использовании первой синтаксической формы условие WHEN удовлетворяется, как только значение проверяемого выражения станет равным значению выражения, указанного в предложении WHEN. При использовании второй синтаксической формы условие WHEN удовлетворяется, как только предикат принимает значение TRUE. При удовлетворении условия оператор CASE возвращает значение, указанное в соответствующем предложении THEN. Если ни одно из условий WHEN не выполнилось, то будет использовано значение, указанное в предложении ELSE. При отсутствии ELSE, будет возвращено NULL-значение. Если удовлетворены несколько условий, то будет возвращено значение предложения THEN первого из них.
В приведенном выше примере была использована вторая форма оператора CASE.
Заметим, что для проверки на NULL стандарт предлагает более короткую форму оператора — COALESCE. Этот оператор имеет произвольное число параметров и возвращает значение первого, отличного от NULL. Для двух параметров оператор COALESCE(A, B) эквивалентен следующему оператору CASE:

Источник

SQL Server: ошибка преобразования типа данных varchar в числовой

У меня есть таблица:

Где Account_Code находится varchar .

Когда я создаю запрос ниже:

Он хорошо работает, возвращая все записи, которые имеют допустимое числовое значение в account_code столбце.

Но когда я пытаюсь добавить еще один выбор, вложенный в предыдущий sql:

запрос вернет ошибку

Error converting data type varchar to numeric.

Что там творится?

Я уже преобразовал в числовой формат, если он account_code действителен, но похоже, что запрос все еще пытается обработать недействительную запись.

Мне нужно использовать BETWEEN предложение в моем запросе.

SQL Server 2012 и более поздние версии

Просто используйте Try_Convert вместо этого:

TRY_CONVERT takes the value passed to it and tries to convert it to the specified data_type. If the cast succeeds, TRY_CONVERT returns the value as the specified data_type; if an error occurs, null is returned. However if you request a conversion that is explicitly not permitted, then TRY_CONVERT fails with an error.

SQL Server 2008 и более ранние версии

Традиционный способ справиться с этим — защитить каждое выражение с помощью оператора case, чтобы независимо от того, когда оно оценивается, оно не создает ошибки, даже если логически кажется, что оператор CASE не нужен. Что-то вроде этого:

Однако мне нравится использовать такие стратегии с SQL Server 2005 и новее:

Что это значит, так это стратегически переключать Account_Code значения NULL внутри X таблицы, когда они не являются числовыми. Сначала я использовал, CROSS APPLY но, как метко заметил Микаэль Эрикссон , это привело к той же ошибке, потому что синтаксический анализатор запросов столкнулся с той же проблемой оптимизации моей попытки принудительно упорядочить выражения (выталкивание предиката победило его). Переключение на OUTER APPLY него изменило фактическое значение операции так, чтобы оно X.Account_Code могло содержать NULL значения во внешнем запросе, что потребовало правильного порядка оценки.

Возможно, вам будет интересно прочитать запрос Microsoft Connect Эрланда Соммарскога об этой проблеме с порядком оценки. Фактически он называет это ошибкой.

Здесь есть дополнительные проблемы, но я не могу их решить сейчас.

PS У меня сегодня был мозговой штурм. Альтернативой «традиционному способу», который я предложил, является SELECT выражение с внешней ссылкой, которое также работает в SQL Server 2000. (Я заметил, что с тех пор, как учился, CROSS/OUTER APPLY я улучшил свои возможности запросов и с более старыми версиями SQL Server — -по я получаю более универсален с «внешним» ссылочными возможностями SELECT , ON и WHERE оговорок!)

Источник

Sometimes, under certain circumstances, when you develop in SQL Server and especially when you try to convert a string data type value to a float data type value, you might get the error message: error converting data type varchar to float. As the error message describes, there is a conversion error and this is most probably due to the input parameter value you used in the conversion function.

Read more below on how you can easily resolve this problem.

Reproducing the Data Type Conversion Error

As mentioned above, the actual reason you get this error message, is that you are passing as a parameter to the CAST or CONVERT SQL Server functions, a value (varchar expression) that is invalid and cannot be converted to the desired data type.

Consider the following example:

-----------------------------------------
--Variable declaration and initialization
-----------------------------------------
DECLARE @value AS VARCHAR(50);

SET @value = '12.340.111,91';

--Perform the casting
SELECT CAST(@value AS FLOAT);

--or
--Perform the conversion
SELECT CONVERT(FLOAT, @value);
-----------------------------------------

If you execute the above code you will get an error message in the following type:

Msg 8114, Level 16, State 5, Line 6
Error converting data type varchar to float.

Another similar example where you get the same data type conversion error, is the below:

-----------------------------------------
--Variable declaration and initialization
-----------------------------------------
DECLARE @value2 AS VARCHAR(50);

SET @value2 = '12,340.15';

--Perform the casting
SELECT CAST(@value2 AS FLOAT);

--or
--Perform the conversion
SELECT CONVERT(FLOAT, @value2);

Why you get this Conversion Error

The exact reason for getting the error message in this case is that you are using the comma (,) as a decimal point and also the dots as group digit symbols. Though SQL Server considers as a decimal point the dot (.). Also when converting a varchar to float you must not use any digit grouping symbols.


Strengthen your SQL Server Administration Skills – Enroll to our Online Course!

Check our online course on Udemy titled “Essential SQL Server Administration Tips
(special limited-time discount included in link).

Via the course, you will learn essential hands-on SQL Server Administration tips on SQL Server maintenance, security, performance, integration, error handling and more. Many live demonstrations and downloadable resources included!

Essential SQL Server Administration Tips - Online Course with Live Demonstrations and Hands-on Guides

(Lifetime Access/ Live Demos / Downloadable Resources and more!)

Enroll from $14.99


How to Resolve the Conversion Issue

In order for the above code to execute, you would need to first remove the dots (that is the digit grouping symbols in this case) and then replace the comma with a dot thus properly defining the decimal symbol for the varchar expression.

Note: You need to be careful at this point, in order to correctly specify the decimal symbol at the correct position of the number.

Therefore, you can modify the code of example 1 as per below example:

-------------------------------------------
--Variable declaration and initialization
-------------------------------------------
DECLARE @value AS VARCHAR(50);

SET @value = '12.340.111,91';

--Prepare the string for casting/conversion to float
SET @value = REPLACE(@value, '.', '');
SET @value = REPLACE(@value, ',', '.');

--Perform the casting
SELECT CAST(@value AS FLOAT);

--or
--Perform the conversion
SELECT CONVERT(FLOAT, @value);
-----------------------------------------

If you execute the above code you will be able to get the string successfully converted to float.

Similarly, you can modify the code of example 2 as per below example:

-----------------------------------------
--Variable declaration and initialization
-----------------------------------------
DECLARE @value2 AS VARCHAR(50);

SET @value2 = '12,340.15';

--Prepare the string for casting/conversion to float
SET @value2 = REPLACE(@value2, ',', '');

--Perform the casting
SELECT CAST(@value2 AS FLOAT);

--or
--Perform the conversion
SELECT CONVERT(FLOAT, @value2);

Again, if you execute the above code you will be able to get the string successfully converted to float.

*Note: Even though you can try changing the regional settings of the PC for setting the dot (.) as the decimal symbol, this will only affect the way the data is presented to you when returned from the casting/conversion call. Therefore, you still have to modify the varchar expression prior to the casting/conversion operation.

Regarding the message: error converting data type varchar to numeric

The above error message is similar to the one we examined in this article, therefore, the way for resolving the issue is similar to the one we described in the article. The only different for the numeric case, is that you will have to replace FLOAT with numeric[ (p[ ,s] )]. Learn more about the numeric data type in SQL Server and how to resolve the above conversion issue, by reading the relevant article on SQLNetHub.

Watch the Live Demonstration on the VARCHAR to FLOAT Data Type Conversion Error

Learn essential SQL Server development tips! Enroll to our Online Course!

Check our online course titled “Essential SQL Server Development Tips for SQL Developers
(special limited-time discount included in link).

Sharpen your SQL Server database programming skills via a large set of tips on T-SQL and database development techniques. The course, among other, features over than 30 live demonstrations!

Essential SQL Server Development Tips for SQL Developers - Online Course

(Lifetime Access, Certificate of Completion, downloadable resources and more!)

Enroll from $14.99

Featured Online Courses:

  • SQL Server 2022: What’s New – New and Enhanced Features
  • Introduction to Azure Database for MySQL
  • Working with Python on Windows and SQL Server Databases
  • Boost SQL Server Database Performance with In-Memory OLTP
  • Introduction to Azure SQL Database for Beginners
  • Essential SQL Server Administration Tips
  • SQL Server Fundamentals – SQL Database for Beginners
  • Essential SQL Server Development Tips for SQL Developers
  • Introduction to Computer Programming for Beginners
  • .NET Programming for Beginners – Windows Forms with C#
  • SQL Server 2019: What’s New – New and Enhanced Features
  • Entity Framework: Getting Started – Complete Beginners Guide
  • A Guide on How to Start and Monetize a Successful Blog
  • Data Management for Beginners – Main Principles

Read Also:

  • The Database Engine system data directory in the registry is not valid
  • Useful Python Programming Tips
  • SQL Server 2022: What’s New – New and Enhanced Features (Course Preview)
  • How to Connect to SQL Server Databases from a Python Program
  • Working with Python on Windows and SQL Server Databases (Course Preview)
  • The multi-part identifier … could not be bound
  • Where are temporary tables stored in SQL Server?
  • How to Patch a SQL Server Failover Cluster
  • Operating System Error 170 (Requested Resource is in use)
  • Installing SQL Server 2016 on Windows Server 2012 R2: Rule KB2919355 failed
  • The operation failed because either the specified cluster node is not the owner of the group, or the node is not a possible owner of the group
  • A connection was successfully established with the server, but then an error occurred during the login process.
  • SQL Server 2008 R2 Service Pack Installation Fails – Element not found. (Exception from HRESULT: 0x80070490)
  • There is insufficient system memory in resource pool ‘internal’ to run this query.
  • Argument data type ntext is invalid for argument …
  • Fix: VS Shell Installation has Failed with Exit Code 1638
  • Essential SQL Server Development Tips for SQL Developers
  • Introduction to Azure Database for MySQL (Course Preview)
  • [Resolved] Operand type clash: int is incompatible with uniqueidentifier
  • The OLE DB provider “Microsoft.ACE.OLEDB.12.0” has not been registered – How to Resolve it
  • SQL Server replication requires the actual server name to make a connection to the server – How to Resolve it
  • Issue Adding Node to a SQL Server Failover Cluster – Greyed Out Service Account – How to Resolve
  • Data Management for Beginners – Main Principles (Course Preview)
  • Resolve SQL Server CTE Error – Incorrect syntax near ‘)’.
  • SQL Server is Terminating Because of Fatal Exception 80000003 – How to Troubleshoot
  • An existing History Table cannot be specified with LEDGER=ON – How to Resolve
  • … more SQL Server troubleshooting articles

Recommended Software Tools

Snippets Generator: Create and modify T-SQL snippets for use in SQL Management Studio, fast, easy and efficiently.

Snippets Generator - SQL Snippets Creation Tool

Learn more

Dynamic SQL Generator: Convert static T-SQL code to dynamic and vice versa, easily and fast.

Dynamic SQL Generator: Easily convert static SQL Server T-SQL scripts to dynamic and vice versa.

Learn more


Get Started with Programming Fast and Easy – Enroll to the Online Course!

Check our online course “Introduction to Computer Programming for Beginners
(special limited-time discount included in link).

The Philosophy and Fundamentals of Computer Programming - Online Course - Get Started with C, C++, C#, Java, SQL and Python

(Lifetime Access, Q&A, Certificate of Completion, downloadable resources and more!)

Learn the philosophy and main principles of Computer Programming and get introduced to C, C++, C#, Python, Java and SQL.

Enroll from $14.99


Subscribe to our newsletter and stay up to date!

Subscribe to our YouTube channel (SQLNetHub TV)

Easily generate snippets with Snippets Generator!

Secure your databases using DBA Security Advisor!

Generate dynamic T-SQL scripts with Dynamic SQL Generator!

Check our latest software releases!

Check our eBooks!

Rate this article: 1 Star2 Stars3 Stars4 Stars5 Stars (17 votes, average: 5.00 out of 5)

Loading…

Reference: SQLNetHub.com (https://www.sqlnethub.com)


How to resolve the error: Error converting data type varchar to float

Click to Tweet

Artemakis Artemiou

Artemakis Artemiou is a Senior SQL Server Architect, Author, a 9 Times Microsoft Data Platform MVP (2009-2018). He has over 20 years of experience in the IT industry in various roles. Artemakis is the founder of SQLNetHub and {essentialDevTips.com}. Artemakis is the creator of the well-known software tools Snippets Generator and DBA Security Advisor. Also, he is the author of many eBooks on SQL Server. Artemakis currently serves as the President of the Cyprus .NET User Group (CDNUG) and the International .NET Association Country Leader for Cyprus (INETA). Moreover, Artemakis teaches on Udemy, you can check his courses here.

Views: 25,940

Я хочу преобразовать данные nvarchar в тип float.

В моем случае у меня есть столбец SalesValue, и я использовал эту команду

UPDATE Overseas 
SET SalesValue = CONVERT(FLOAT, REPLACE([SalesValue],',','') )

Моя таблица имеет такие значения, как

201.01
40.50
215.12
550
304.201

Но я получаю ошибку

SQL: Ошибка при преобразовании типа данных nvarchar в float.

Как я могу решить эту проблему ?

4 ответа

Лучший ответ

1-е приведение значения с помощью запроса ниже, а затем обновите нормально

 SELECT
          case when  ISNUMERIC([SalesValue])=1
          then CAST([SalesValue] AS FLOAT) else 0 end AS CastedValue)
      FROM your_table_name


0

Zaynul Abadin Tuhin
6 Июн 2017 в 12:41

Это приблизит вас к ISNUMERIC()

declare @table table (SalesValue varchar(16))
insert into @table
values
('1e4'),
('$'),
('134.55'),
('66,9897'),
('14')

select
    SalesValue
    ,case 
        when SalesValue NOT LIKE '%[^0-9,.]%' 
        then convert(decimal(16,4),replace(SalesValue,',','.'))
    end
from 
    @table


0

scsimon
6 Июн 2017 в 13:35

Вы должны найти значения, которые не совпадают. В SQL Server 2012+ вы можете использовать try_convert(). Это не доступно. Так как насчет этого?

SELECT SalesValue
FROM Overseas
WHERE SalesValue LIKE '%[^0-9,.]%' OR
      SalesValue LIKE '%[.,]%[.,]%';

Я думаю, что это покрывает очевидные нарушения: символ, который не является числовым или двумя (или более) десятичными точками.


1

Gordon Linoff
5 Июн 2017 в 20:57

Похоже, что у вас все еще есть не числовые данные. Я надеюсь, что ваша сторона приложения проделала довольно хорошую работу по очистке ваших данных перед вводом, и проблема, вероятно, в том, что у вас есть «$» в одном или нескольких ваших полях. Преобразование завершится неудачно, когда у вас будет не числовой символ, отличный от ‘.’ в нем (как вы, вероятно, знаете, именно поэтому вы удалили ‘,’). Я запустил приведенный ниже скрипт, чтобы проверить это.

declare @myFloat float;
declare @test1 nvarchar(10) = '145.88';
declare @test2 nvarchar(10) = '4,145.88';
declare @test3 nvarchar(10) = '$4,145.88';

SELECT ISNUMERIC(@TEST3)
set @myFloat = CONVERT(FLOAT, REPLACE(@test1,',','') );
select @myFloat;

set @myFloat = CONVERT(FLOAT, REPLACE(@test2,',','') );
select @myFloat;

--THIS WILL FAIL
set @myFloat = CONVERT(FLOAT, REPLACE(@test3,',','') );
select @myFloat;
--THIS WILL NOT FAIL
set @myFloat = CONVERT(FLOAT, REPLACE(REPLACE(@test3,',',''),'$','') );
select @myFloat;

Вы можете попробовать запустить приведенный ниже скрипт для рассматриваемого столбца, чтобы увидеть, с какими столбцами у вас возникла проблема:

--run this on your table
SELECT SalesValue
FROM Overseas
WHERE ISNUMERIC(REPLACE(SalesValue,',','')) = 0

--test sample
/*
insert into #myTable
values ('145.88'),
       ('4,145.88'),
       ('$4,145.88'),
       ('$4,145.88%'); 

SELECT *
FROM #myTable
WHERE ISNUMERIC(REPLACE(amounts,',','')) = 0 
--WHERE ISNUMERIC(REPLACE(REPLACE(amounts,',',''),'$','')) = 0 --this will remove results with $ also
*/

Таким образом, ваше исправление будет состоять в том, чтобы просто изменить предоставленную вами строку:

UPDATE Overseas SET SalesValue = CONVERT(FLOAT, REPLACE(REPLACE([SalesValue],',',''),'$','') )

Если вы не нашли другие символы в результатах предыдущего сценария.


0

chris
5 Июн 2017 в 22:16

How to solve Arithmetic overflow error converting IDENTITY to data type tinyint, smallint or int in Microsoft SQL Server database

The error «Arithmetic overflow error converting IDENTITY to data type int» comes when IDENTITY value is inserted into a column of data type int, but the value is out-of-range. For example, if the current value of Identity becomes more than 2,147,483,647, then you cannot store that into an int column because it’s more than the maximum value of int in SQL Server.

The error is more common with columns using smaller datatypes like SMALLINT, TINYINT, and INT and uses IDENTITY feature to automatically generate values. For example, you will get «Arithmetic overflow error converting IDENTITY to data type smallint» if identity value crosses 32,767 which is the maximum value for smallint in SQL Server.

Similarly, you will get «Arithmetic overflow error converting IDENTITY to data type tinyint» if IDENTITY has grown beyond 255, the maximum value of tinyint data type in SQL Server.

Anyway, let’s turn back our focus on how to solve this problem.

The Problem

You are getting «Arithmetic overflow error converting IDENTITY to data type int,» or maybe «Arithmetic overflow error converting IDENTITY to data type smallint,» or «Arithmetic overflow error converting IDENTITY to data type tinyint» while inserting data into a table which uses IDENTITY in SQL Server. It totally depends upon the data type of column but error suggests that the problem is related to IDENTITY and values are out-of-range.

Troubleshooting

First thing first is to find out where exactly the error is occurring, like which column, which table and which database. Unfortunately, SQL Server errors not very accurate, but they are not bad at all. They will likely tell you which stored procedure you were running and which line of SQL caused this error. By following those traces, you can locate the column where data insertion is failing.

Once you found the column, you can confirm the data type, like if you are getting «Arithmetic overflow error converting IDENTITY to data type tinyint» error then most likely your column would have tinyint as a data type. Similarly, it could be an int or small int.

After that, we need to find the current value of IDENTITY for that table, and for that, we need to use DBCC tool as shown below:

DBCC CHECKIDENT('Audit.OrderDetails')

This will print something like:

Checking identity information: current identity value ‘11762933’, current column value ‘11762933’.

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

If this value is out-of-range, then it confirms that the IDENTITY value is causing the problem.

Solution

There are two solutions to this problem —

1. First one is to increase the data type of column to bigint, a 64 bit int value in SQL Server which ranges from -2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807).

2. Or, reseed the IDENTITY value if there are gaps in the value and current rows in the table is less than the range of values supported by that column.

For example, if your OrderId column which is causing problem has an int data type, but there are only 1 billion rows there, but IDENTITY value is already 2147483647 then you can reseed the IDENTITY to take advantage of the gap between an actual number of rows and the current value of IDENTITY.

But, for reseeding you either need to drop the table or truncate it and for that reason it’s better to copy the data into a temporary table and once the IDENTITY is reseeded, copy it again into the main table as shown below:

SELECT * INTO temp..OrderDetailsBackup FROM OrderDetails ORDER BY OrderId   

TRUNCATE TABLE OrderDetails   

DBCC CHECKIDENT (OrderDetails, RESEED,1)

INSERT INTO OrderDetails( ....) SELECT (....) FROM OrderDetailsBackup

By doing this, all the rows now have IDENTITY values starting from one. You can also confirm the maximum value for your IDENTITY column by using the MAX function, as shown below:

SELECT MAX(OrderId) FROM OrderDetails

This will give you a good idea, how much your table can grow further without breaking with «Arithmetic overflow error converting IDENTITY to data type tinyint» or «Arithmetic overflow error converting IDENTITY to data type smallint» error.

Though, before applying any solution, like increasing the data type or reseeding the IDENTITY value, you need to perform due diligence. For example, if you are accessing that column into some other code then that could break.

If you increase the data type, like if a Java code is accessing an int column and storing data into an int field, which has same range as SQL Server int, i.e. (2,147,483,647) then a big value will not fit into it and it will overflow into a negative value, which can cause issue.

Similarly, reseeding IDENTITY can also cause a problem if that value is used to generate something else. Having similar value may result in duplicate Ids in some other system.

So, even though the solution of «Arithmetic overflow error converting IDENTITY to data type tinyint» is simple, it can be complicated to solve in a real-world scenario. It won’t be easy to increase the range if your table is essential, and contains data which you cannot lose, and many clients are using that data live.

Though, a good knowledge of SQL Server itself comes handy while dealing with such issues in real-world, hence I suggest every programmer working in SQL Server to learn some T-SQL and Administration functionality. If you think like this then you should check out SQL Server Fundamentals by Dan Sullivan course on Pluralsight to actually learn these stuff.

Summary

1. «Arithmetic overflow error converting IDENTITY to data type int» error means the value of IDENTITY is overflowing range of data type of that particular column.

2. Check the current value of Identity

3. Increase data type to bigint or reseed IDENTITY

DBCC CHECKIDENT (OrderDetails, RESEED,1)

That’s all about how to solve «Arithmetic overflow error converting IDENTITY to data type int» error in Microsoft SQL Server. As I said, you have two option either increase the data type or make use of unused identities to keep the value in the range. If you don’t care duplicates then simply reseeding Identity can also work.

Source: Java67

The Tech Platform

www.thetechplatform.com

Понравилась статья? Поделить с друзьями:
  • Maya motion path option объект переворачивается как исправить
  • Maya fatal error attempting to save in temp
  • Maya color management error
  • May your drivers are outdated как исправить
  • May not be available in some apps как исправить