loading..
Русский    English
14:42
листать

Преобразование типов и оператор CAST стр. 3

Есть одна особенность использования оператора CAST в SQL Server, связанная с преобразованием числа к его строковому представлению. Что произойдет, если число символов в числе превышает размер строки? Например,

Консоль
Выполнить
  1. SELECT CAST(1234.6 AS VARCHAR(5));

Следует ожидать, что мы получим сообщение об ошибке. Правильно, вот это сообщение:

Arithmetic overflow error converting numeric to data type varchar.

(«Ошибка арифметического переполнения при преобразовании числа к типу данных VARCHAR».)

Естественно, что мы будем ожидать того же сообщения и при выполнении следующего оператора:

Консоль
Выполнить
  1. SELECT CAST(123456 AS VARCHAR(5));

Но нет. В результате мы получим символ «*» вместо сообщения об ошибке. Мы не беремся судить, с чем это связано, однако, однажды мы столкнулись с проблемой диагностики ошибки в коде, в котором впоследствии выполнялось обратное преобразование к числовому типу.

В нашем простейшем примере это будет выглядеть так:

Консоль
Выполнить
  1. SELECT CAST(CAST(123456 AS VARCHAR(5)) AS INT);

Вот тут-то мы и получаем ошибку:

Syntax error converting the varchar value '*' to a column of data type int.

(«Ошибка синтаксиса при преобразовании значения «*» к типу данных INT».)

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

Денежный тип данных не является стандартным. В SQL Server имеется два денежных типа:

money: диапазон значений от –922,337,203,685,477.5808 до 922,337,203,685,477.5807

smallmoney: диапазон значений от -214 748,3648 до 214 748,3647

Точность обоих типов одна десятитысячная.

Константу типа money можно задать с помощью префикса $, или же использовать преобразование типов, например:

Консоль
Выполнить
  1. SELECT 1.2 num, $1.2 mn1, CAST(1.2 AS MONEY) mn2;

num   mn1    mn2
1.2    1,20    1,20

Обратите внимание на запятую в качестве разделителя "рублей" и "копеек" - не точка!

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

Консоль
Выполнить
  1. SELECT CAST(1.75 AS INT) int_num, CAST($1.75 AS INT) int_mon;

int_num    int_mon
1    2

Деньги таки, их просто так терять нельзя!


Страницы: 1 2 3
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
wmb на wmr . ремонт ноутбука
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.