Преобразование типов и оператор CAST стр. 1
В реализациях языка Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL может быть выполнено неявное преобразование типов. Так, например, в
Transact-SQL (T-SQL) — процедурное расширение языка SQL, используемое для программирования на стороне сервера в Microsoft
Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. SQL Server и Sybase ASE. Transact-SQL при сравнении или комбинировании значений типов smallint и int, данные типа smallint неявно преобразуются к типу int. Подробно о явном и неявном преобразовании типов в SQL Server можно прочитать в BOL.
Вывести среднюю цену портативных компьютеров с предваряющим текстом «средняя цена = ».
Попытка выполнить запрос

Консоль
Выполнить
приведет к сообщению об ошибке:
Implicit conversion from data type varchar to money is not allowed. Use the CONVERT function to run this query.
(«Не допускается неявное преобразование типа varchar к типу money. Используйте для выполнения этого запроса функцию CONVERT» .)
Это сообщение означает, что система не может выполнить неявное преобразование типа varchar к типу money. В подобных ситуациях может помочь явное преобразование типов. При этом, как указано в сообщении об ошибке, можно воспользоваться функцией CONVERT . Однако эта функция не стандартизована, поэтому в целях переносимости рекомендуется использовать стандартное выражение CAST . С него и начнем.
Итак, если переписать наш запрос в виде

Консоль
Выполнить
Как изменить тип переменной в sql
1 (один байт содержит до 8 битов)
Описание каждого типа данных приводится далее.
Точные числовые типы: Целые
SQL Сервер предоставляет три типа данных для задания целых чисел: tinyint (маленькое целое), smallint (малое целое) и int (целое). Эти типы данных являются точными числовыми, поскольку при выполнении арифметических операций с числами этих типов сохраняются все значящие цифры.
Выбор нужного типа для хранения целых чисел основывается на ожидаемой величине этих чисел. Число байтов памяти, выделяемой для хранения чисел, зависит от типа данных.
Таблица 6-2: Целые типы данных
Диапазон сохраняемых чисел
Число байтов памяти
Все числа от 0 до 255, включительно. (Отрицательные значения не допускаются.)
Все числа от 2 15 -1 до -2 15 (32,767 до -32,768), включительно.
Все числа от 2 31 -1 до -2 31 (2,147,483,647 до
Точные числовые типы: Десятичные числа
Для хранения дробных чисел SQL Сервер предоставляет два других числовых типа данных numeric (числовой) и decimal (десятичный). Данные, которые хранятся в табличных столбцах типа numeric и decimal упаковываются для экономии дисковой памяти и сохраняются после арифметических операций с точностью до наименьшего значимого разряда. Типы данных numeric и decimal (десятичный) одинаковы во всех отношениях за исключением того, что только тип numeric с нулевой шкалой может быть использован для столбца IDENTITY (счетчиковый).
В определении точных числовых типов можно использовать два необязательных параметра, precision (точность) и scale (шкала), которые заключаются в скобки и разделяются запятой:
datatype [(точность [, шкала])]
SQL Сервер воспринимает каждую комбинацию этих параметров как отдельный тип данных. Например, numeric(10,0) и numeric(5,0) являются двумя отдельными типами данных. Точность и шкала определяют диапазон значений, которые можно хранить в табличных столбцах типа decimal или numeric:
· Точность определяет максимальное число десятичных разрядов, которые могут храниться в столбце этого типа. Сюда включаются все разряды, расположенные как слева, так и справа от десятичной точки. Точность представления чисел можно выбрать из диапазона от 1 до 38 разрядов , или использовать точность в 18 разрядов, которая устанавливается по умолчанию;
· Шкала определяет максимальное число разрядов, которые могут располагаться справа от десятичной точки. Заметим, что шкала должна быть меньше или равна точности. Шкалу можно задавать от 0 до 38 разрядов, или использовать по умолчанию нулевую шкалу.
Точные числовые значения со шкалой 0 выводятся без десятичной точки. Если в столбец таблицы вводится значение, которое превосходит либо точность, либо шкалу, установленную для этого столбца, то SQL Сервер укажет на ошибочное значение.
Объем памяти, выделяемый для хранения в столбце значений типа numeric и decimal, зависит от точности, указанной для этого типа. Минимальный объем памяти для одно- или двухразрядных типов составляет 2 байта. Объем требуемой памяти возрастает на 1 байт на каждые два дополнительных разряда вплоть до максимальной величины, составляющей 17 байтов.
Приближенные числовые типы данных
Для хранения числовых данных, которые округляются при выполнении арифметических операций, SQL Сервер предоставляет три приближенных числовых типа данных float (плавающий) , double precision (двойная точность) и real (действительный) . Приближенные типы следует применять для данных, которые могут изменяться в широком диапазоне значений. К этим типам данных могут применяться все аггрегирующие функции и арифметические операции, за исключением операции вычисления по модулю ( %).
Типы данных float и double precision построены на основе типов, содержащихся в операционной системе. Тип данных float допускает указание точности, которую нужно заключить в кавычки. Данные типа float с точностью от 1 до 15 разрядов храняться также как данные типа real, в то время как данные с более высокой точностью храняться также как данные типа double precision. Диапазон и точность представления данных этих трех типов зависят от используемого компьютера.
В следующей таблице показаны диапазон, точность представления и объем памяти, предусмотренные для каждого приближенного числового типа. Заметим, что процедура isql выводит только 6 значащих разрядов после десятичной точки, а остаток округляет.
Таблица 6-3: Приближенные числовые типы данных
float[(точность_по_умолчанию)]
4, если точность < 16,
8, если точность >= 16
double precision
Символьные типы данных
Символьные типы данных используются для хранения символьных строк, состоящих из букв, цифр, символов, и заключенных в простые или двойные кавычки. Для работы с данными этого типа можно использовать ключевое слово like для поиска строк, содержащих указанную комбинацию символов, а также встроенные строковые функции. Строки, состоящие из цифр, можно преобразовать в данные точного или приближенного числового типа с помощью функции convert (преобразовать), а затем выполнять арифметические операции.
Данные типа char(n) хранятся в массиве байтов фиксированной длины, а данные типа varchar(n) в массиве переменной длины, когда число символов алфавита не превосходит емкости одного байта, как например для строки на английском языке. “Национальные” двойники для данных этих типов, т.е. данные типа nchar(n) и nvarchar(n) хранятся соответственно в массивах фиксированной и переменной длины, но на хранения одного символа может выделяться несколько байтов, как например для строки на японском языке. Максимальное число символов в строке можно задать параметром n или по умолчанию ограничиться строкой в один символ. Для строк, длина которых превосходит емкость одного байта (т.е. 255), следует использовать тип данных text (текст).
Таблица 6-4: Символьные типы данных
Массив байтов фиксированной длины, например, для телефонных номеров или почтовых кодов
Массив байтов переменной длины, например, для имен и фамилий, изменяющихся в широких пределах
Текущая длина строки
Массив фиксированной длины для строк в мультибайтовом алфавите
Массив переменной длины для строк в мультибайтовом алфавите
Текущая длина строки *@@ncharsize
Связанный список страниц данных, достигающий 2,147,483,647 байтов, для хранения печатных символов
0, пока текст не инициализирован; по 2K байтов на страницу после инициализации
SQL Сервер укорачивает вводимые в столбец таблицы строки до ширины этого столбца, без специальных предупреждений и сообщений об ошибке, если не установлена опция string_truncation on. О команде установки опций set можно прочесть в Справочном руководстве SQL Сервера. Пустая строка (“” или “) хранится в виде одного пробела, а не как NULL (неопределенное значение). Следовательно, значением выражения “abc”+“”+“def” является строка “abc def “ , а не “abcdef”.
Хранение строк в столбцах с фиксированной и переменной длиной отличается друг от друга в следующих отношениях:
· Строки в столбцах фиксированной длины с конца дополняются пробелями до длины этого столбца. Для данных типа char отводится n байтов памяти; а для данных типа nchar число n умножается на значение переменной @@ncharsize, которое равно средней длине (в байтах) символа национального алфавита. Когда создается столбец типа char и nchar, в котором допускаются неопределенные значения, то SQL Сервер автоматически преобразует их в типы varchar и nvarchar соответственно и сохраняет значения в соответствии с этими типами данных. (Этого не происходит для переменных типа char и nchar, и параметров).
· В строках, расположенных в столбцах переменной длиной, наоборот концевые пробелы удаляются, поэтому память затрачивается только на хранение значащих символов. Для столбцов типа varchar число байтов, использующихся для хранения данных, равно длине строки; а для столбцов nvarchar это число равно длине строки, умноженной на среднюю длину символов национального алфавита. Данные переменной длины могут требовать меньший объем памяти для хранения по сравнению с данными фиксированной длины, но доступ к ним происходит медленнее.
Данные типа text могут достигать длины до 2,147,483,647 печатных символов (байтов) и память для них выделяется отдельными страницами, которые храняться в виде связанного списка. Для экономии памяти, столбцы типа text следует определять с опцией NULL. При первой записи непустого текста в такой столбец операторами insert (вставить) или update (обновить) , SQL Сервер заводит текстовый указатель и выделяет полную страницу памяти размером 2K байтов для хранения этого текста. Каждая страница может хранить до 1800 байтов текста. Для добавления данных без сохранения больших блоков текста в журнале транзакций, следует использовать процедуру writetext (запись текста). Об этом можно получить информацию в Справочном Руководство SQL Сервера.
Двоичные типы данных
Двоичные (бинарные) типы данных предназначены для хранения неформатированной двоичной информации, например, графических изображений в 16-ричном коде. Двоичные данные начинаются с символов вида ”0x” и могут содержать любую комбинацию цифр, а также строчные или прописные буквы от A до F.
Замечание: Обработка SQL Сервером двоичных данных зависит от реализации. Для данных в настоящем шестнадцатиричном коде следует использовать функции hextoint и inttohex. См. по этому поводу главу 10 “Использование встроенных функций в запросах”.
Типы binary(n) и varbinary(n) используются для хранения данных размером до 255 байтов. Каждый байт памяти содержит 2 шестнадцатиричные цифры. Длину данных, вносимых в столбец, можно определить числом n или использовать по умолчанию длину в один байт. Если в столбец таблицы ввести данные, длина которых превышает число n, то SQL Сервер укорачивает введенные данные до указанной длины без предупреждений и сообщений об ошибке.
· Тип данных с фиксированной длиной binary(n) следует использовать для хранения наборов данных, в которых все члены набора имеют примерно одинаковую длину. Поскольку данные в столбцах с этим типом дополняются нулями до длины столбца, то они могут потребовать для своего хранения несколько большего объема памяти , по сравнению с данными типа varbinary, но доступ к ним происходит немного быстрее;
· Тип данных с переменной длиной varbinary(n) следует использовать для хранения наборов данных, в которых размеры отдельных членов набора могут сильно изменяться. Объем памяти, необходимый для хранения таких данных, определяется действительной длиной этих данных, а не длиной столбца. При этом нули на концах двоичных строк отбрасываются.
При создании столбца типа binary, в котором допускаются неопределенные значения, SQL Сервер автоматически преобразует его в тип varbinary и хранит данные в этом формате.
Можно проводить поиск в двоичных строках с помощью ключевого слова like, а также применять к ним встроенные функции. Поскольку точный вид внутреннего представления двоичных данных зависит от аппаратного обеспечения, то вычисления, включающие двоичные данные, могут выдавать различные результаты на разных платформах.
Двоичный тип данных image (изображение) следует использовать для хранения больших блоков двоичных данных на внешних страницах данных. В столбце типа image можно записать до 2,147,483,647 байтов информации, которая хранится в виде связанного списка страниц данных, отдельно от других табличных данных. При первой записи определенного значения в столбец типа image операторами insert или update, SQL Сервер заводит текстовый указатель и выделяет полную страницу данных размером 2К для хранения этого значения. Каждая страница может содержать до 1800 байтов информации.
Для экономии памяти, в столбцах типа image следует допускать неопределенное значение NULL. Следует также использовать процедуру writetext, чтобы при добавлении данных в столбец типа image в журнал транзакций не записывались большие блоки текста. Более детальную информацию по этому поводу можно посмотреть в Справочном руководство SQL сервера.
Таблица 6-5: Бинарные типы данных
Число байтов памяти
Как изменить тип переменной в sql
Когда мы присваиваем значение одного типа столбцу, который хранит данные другого типа, либо выполняем операции, которые вовлекают данные разных типов, SQL Server пытается выполнить преобразование и привести используемое значение к нужному типу. Но не все преобразования SQL Server может выполнить автоматически. SQL Server может выполнять неявные преобразования от типа с меньшим приоритетом к типу с большим приоритетом. Таблица приоритетов (чем выше, тем больший приоритет):
| datetime |
| smalldatetime |
| float |
| real |
| decimal |
| money |
| smallmoney |
| int |
| smallint |
| tinyint |
| bit |
| nvarchar |
| nchar |
| varchar |
| char |
То есть SQL Server автоматически может преобразовать число 100.0 (float) в дату и время (datetime).
В тех случаях, когда необходимо выполнить преобразования от типов с высшим приоритетом к типам с низшим приоритетом, то надо выполнять явное приведение типов. Для этого в T-SQL определены две функции: CONVERT и CAST .
Функция CAST преобразует выражение одного типа к другому. Она имеет следующую форму:
CAST(выражение AS тип_данных)
Для примера возьмем следующие таблицы:
CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); CREATE TABLE Customers ( Id INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(30) NOT NULL ); CREATE TABLE Orders ( Id INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE, CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE, CreatedAt DATE NOT NULL, ProductCount INT DEFAULT 1, Price MONEY NOT NULL );
Например, при выводе информации о заказах преобразует числовое значение и дату в строку:
SELECT Id, CAST(CreatedAt AS nvarchar) + '; total: ' + CAST(Price * ProductCount AS nvarchar) FROM Orders

Convert
Большую часть преобразований охватывает функция CAST. Если же необходимо какое-то дополнительное форматирование, то можно использовать функцию CONVERT . Она имеет следующую форму:
CONVERT(тип_данных, выражение [, стиль])
Третий необязательный параметр задает стиль форматирования данных. Этот параметр представляет числовое значение, которое для разных типов данных имеет разную интерпретацию. Например, некоторые значения для форматирования дат и времени:
- 0 или 100 — формат даты «Mon dd yyyy hh:miAM/PM» (значение по умолчанию)
- 1 или 101 — формат даты «mm/dd/yyyy»
- 3 или 103 — формат даты «dd/mm/yyyy»
- 7 или 107 — формат даты «Mon dd, yyyy hh:miAM/PM»
- 8 или 108 — формат даты «hh:mi:ss»
- 10 или 110 — формат даты «mm-dd-yyyy»
- 14 или 114 — формат даты «hh:mi:ss:mmmm» (24-часовой формат времени)
Некоторые значения для форматирования данных типа money в строку:
- 0 — в дробной части числа остаются только две цифры (по умолчанию)
- 1 — в дробной части числа остаются только две цифры, а для разделения разрядов применяется запятая
- 2 — в дробной части числа остаются только четыре цифры
Например, выведем дату и стоимость заказов с форматированием:
SELECT CONVERT(nvarchar, CreatedAt, 3), CONVERT(nvarchar, Price * ProductCount, 1) FROM Orders

TRY_CONVERT
При использовании функций CAST и CONVERT SQL Server выбрасывает исключение, если данные нельзя привести к определенному типу. Например:
SELECT CONVERT(int, 'sql')
Чтобы избежать генерации исключения можно использовать функцию TRY_CONVERT . Ее использование аналогично функции CONVERT за тем исключением, что если выражение не удается преобразовать к нужному типу, то функция возвращает NULL:
SELECT TRY_CONVERT(int, 'sql') -- NULL SELECT TRY_CONVERT(int, '22') -- 22
Дополнительные функции
Кроме CAST, CONVERT, TRY_CONVERT есть еще ряд функций, которые могут использоваться для преобразования в ряд типов:
- STR(float [, length [,decimal]]) : преобразует число в строку. Второй параметр указывает на длину строки, а третий — сколько знаков в дробной части числа надо оставлять
- CHAR(int) : преобразует числовой код ASCII в символ. Нередко используется для тех ситуаций, когда необходим символ, который нельзя ввести с клавиатуры
- ASCII(char) : преобразует символ в числовой код ASCII
- NCHAR(int) : преобразует числовой код UNICODE в символ
- UNICODE(char) : преобразует символ в числовой код UNICODE
SELECT STR(123.4567, 6,2) -- 123.46 SELECT CHAR(219) -- Ы SELECT ASCII('Ы') -- 219 SELECT NCHAR(1067) -- Ы SELECT UNICODE('Ы') -- 1067
Как изменить тип данных в столбце представления
, но так как dbo.DetailsView — представление, то очевидно не сработало.
Манипулировал по-всякому с ALTER VIEW и т.п. и тоже не получается, поисковики даже ничего приближённого к решению этой проблемы не выдают. Очень хочу понять, как это можно сделать.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Изменить тип данных столбца, являющегося идентификатором
Здравствуйте! Помогите, пожалуйста, разрулить вот какую проблему: Есть таблица Table, наполненная.
Изменить тип представления результатов
Подскажите как изменить представление результатов решения системы линейных уравнений, мне нужно.
Как изменить тип данных на абстрактный?
#include <iostream> #include <cstdlib> using namespace std; double *getSequence(int n)
VBA Excel 2003: подпись данных на столбце диаграммы: как изменить FontSize
Как программно изменить размер шрифта в подписи данных ряда (число написанное на столбце) ? Никак.
3363 / 2059 / 736
Регистрация: 02.06.2013
Сообщений: 5,044
1 2 3 4 5 6
alter view dbo.DetailsView as select . cast(Материал as nvarchar(50)) as Материал .
Регистрация: 19.01.2018
Сообщений: 4
Если не сложно, то подскажите пожалуйста что подразумевается под троеточием?
На их месте должны быть ещё какие-то элементы кода?
3363 / 2059 / 736
Регистрация: 02.06.2013
Сообщений: 5,044
Сообщение от Kumamonsky 
Если не сложно, то подскажите пожалуйста что подразумевается под троеточием?
Ответ подразумевает, что вы в тексте представления замените в select Материал на cast(Материал as nvarchar(50)) as Материал
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как программно изменить тип данных в Excel?
Программа на VBasic возвращает из базы набор данных. В одной колонке данные типа Date. А.

Как можно изменить тип данных в таблице
Как можно изменить тип данных в таблице? После импорта таблицы тип данных "текстовый", а нужен.
Как изменить тип данных поля при импорте
Импортирую таблицу Excel в Access Access присваивает при импорте тип данных поля в зависимости от.

Определить комбинированный тип для представления следующих данных
Определить комбинированный тип для представления следующих данных: анке- та (ФИО, пол, возраст.
