sql_variant (Transact-SQL)
применяется:sql Server
Базе данных SQL Azure
Управляемому экземпляру SQL Azure
базе данных SQL в Microsoft Fabric
Тип данных, который хранит значения различных типов данных, поддерживаемых SQL Server.
Соглашения о синтаксисе Transact-SQL
Синтаксис
sql_variant
Замечания
sql_variant может использоваться в столбцах, параметрах, переменных и значениях, возвращаемых определяемыми пользователем функциями. sql_variant позволяет этим объектам баз данных поддерживать значения других типов данных.
Столбец типа sql_variant может содержать строки различных типов данных. Например, в столбце, определенном как sql_variant, могут храниться значения int, binary и char.
Максимальная длина значения типа данных sql_variant составляет 8016 байт. Сюда входят сведения о базовом типе и значение базового типа. Максимальная длина значения соответствующего базового типа составляет 8 000 байт.
Перед тем как задействовать тип данных sql_variant в таких операциях, как сложение и вычитание, его нужно привести к значению базового типа данных.
Типу данных sql_variant может быть присвоено значение по умолчанию. Этот тип данных в качестве значения может содержать значение NULL, однако значению NULL не будет соответствовать базовый тип. Кроме того, тип данных sql_variant не может в качестве базового иметь другой тип данных sql_variant.
Уникальный, первичный или внешний ключ может содержать столбцы типа sql_variant, но общая длина значений данных, составляющих ключ определенной строки, не должна превышать максимальную длину индекса. Эта длина составляет 900 байт.
Таблица может иметь любое количество столбцов типа sql_variant.
Тип sql_variant нельзя использовать в инструкциях CONTAINSTABLE и FREETEXTTABLE.
Протокол ODBC поддерживает тип sql_variant не полностью. Поэтому столбцы типа sql_variant, запрашиваемые через поставщик Microsoft OLE DB для ODBC (MSDASQL), возвращаются в виде двоичных данных. Например, столбец типа sql_variant, содержащий строку "PS2091", возвращается в виде 0x505332303931.
Сравнение значений sql_variant
Тип sql_variant находится на вершине иерархического списка преобразования типов данных. Для сравнения sql_variant порядок иерархии типов данных SQL Server группируется в семейства типов данных.
Иерархия типов данных | Семейство типов данных |
---|---|
sql_variant | sql_variant |
datetime2 | Дата и время |
datetimeoffset | Дата и время |
datetime | Дата и время |
smalldatetime | Дата и время |
date | Дата и время |
time | Дата и время |
float | Приблизительное числовое значение |
real | Приблизительное числовое значение |
десятичное | Точное числовое значение |
money | Точное числовое значение |
smallmoney | Точное числовое значение |
bigint | Точное числовое значение |
int | Точное числовое значение |
smallint | Точное числовое значение |
tinyint | Точное числовое значение |
bit | Точное числовое значение |
nvarchar | Unicode |
nchar | Unicode |
varchar | Unicode |
char | Unicode |
varbinary | Binary |
binary | Binary |
uniqueidentifier | Uniqueidentifier |
К сравнениям типов sql_variant применяются указанные ниже правила.
- При сравнении значений sql_variant различных базовых типов данных, находящихся в разных семействах типов данных, большим из двух значений считается то, семейство типа данных которого находится выше в иерархии.
- При сравнении значений sql_variant различных базовых типов данных, находящихся в одном семействе типов данных, значение, базовый тип данных которого находится ниже в иерархии, неявно приводится к другому типу данных, после чего производится сравнение.
- При сравнении значений sql_variant типа данных char, varchar, nchar или nvarchar их параметры сортировки сначала сравниваются на основе следующих критериев: код языка, версия кода языка, флаги сравнения и идентификатор сортировки. Каждый из этих критериев сравнивается как целочисленное значение в приведенном порядке. Если все эти критерии равны, то сами строковые значения сравниваются в соответствии с параметрами сортировки.
Преобразование данных типа sql_variant
При обработке типа данных sql_variant SQL Server поддерживает неявное преобразование объектов с другими типами данных в тип sql_variant . Однако SQL Server не поддерживает неявные преобразования из sql_variant данных в объект с другим типом данных.
Ограничения
В списке ниже перечислены типы значений, которые не могут сохраняться с помощью типа данных sql_variant.
- datetimeoffset1
- geography
- geometry
- hierarchyid
- Изображение
- ntext
- nvarchar(max)
- rowversion (timestamp)
- text
- varchar(max)
- varbinary(max)
- Определяемые пользователем типы
- xml
1 SQL Server 2012 и более поздней версии не ограничивает datetimeoffset.
Примеры
А. Использование sql_variant в таблице
В приведенном ниже примере создается таблица с типом данных sql_variant. Затем извлекаются сведения SQL_VARIANT_PROPERTY
о значении colA
46279.1
, где colB
=1689
, при условии, что tableA
имеет colA
типа sql_variant
и colB
.
CREATE TABLE tableA(colA sql_variant, colB INT)
INSERT INTO tableA values ( CAST(46279.1 as decimal(8,2)), 1689)
SELECT SQL_VARIANT_PROPERTY(colA,'BaseType') AS 'Base Type',
SQL_VARIANT_PROPERTY(colA,'Precision') AS 'Precision',
SQL_VARIANT_PROPERTY(colA,'Scale') AS 'Scale'
FROM tableA
WHERE colB = 1689
Вот результирующий набор. Обратите внимание, что каждое из этих трех значений является sql_variant.
Base Type Precision Scale
--------- --------- -----
decimal 8 2
(1 row(s) affected)
B. Использование типа sql_variant в качестве переменной
В приведенном ниже примере создается переменная с помощью типа данных sql_variant, а затем извлекаются сведения SQL_VARIANT_PROPERTY
о переменной с именем @v1.
DECLARE @v1 sql_variant;
SET @v1 = 'ABC';
SELECT @v1;
SELECT SQL_VARIANT_PROPERTY(@v1, 'BaseType');
SELECT SQL_VARIANT_PROPERTY(@v1, 'MaxLength');
См. также
CAST и CONVERT (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)