sql_variant (Transact-SQL)

Применимо к:база данныхSQL Server Azure SQL Управляемый экземпляр SQL Azure

Тип данных, хранящий значения различных типов данных, поддерживаемых SQL Server.

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

Синтаксис

sql_variant  

Примечание

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

Remarks

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 Приблизительное числовое значение
decimal Точное числовое значение
money Точное числовое значение
smallmoney Точное числовое значение
bigint Точное числовое значение
int Точное числовое значение
smallint Точное числовое значение
tinyint Точное числовое значение
bit Точное числовое значение
nvarchar Юникод
nchar Юникод
varchar Юникод
char Юникод
varbinary Двоичные данные
binary Двоичные данные
uniqueidentifier Уникальный идентификатор

К сравнениям типов sql_variant применяются указанные ниже правила.

  • При сравнении значений sql_variant различных базовых типов данных, находящихся в разных семействах типов данных, большим из двух значений считается то, семейство типа данных которого находится выше в иерархии.
  • При сравнении значений sql_variant различных базовых типов данных, находящихся в одном семействе типов данных, значение, базовый тип данных которого находится ниже в иерархии, неявно приводится к другому типу данных, после чего производится сравнение.
  • При сравнении значений sql_variant типа данных char, varchar, nchar или nvarchar их параметры сортировки сначала сравниваются на основе следующих критериев: код языка, версия кода языка, флаги сравнения и идентификатор сортировки. Каждый из этих критериев сравнивается как целочисленное значение в приведенном порядке. Если все эти критерии равны, то сами строковые значения сравниваются в соответствии с параметрами сортировки.

Преобразование данных типа sql_variant

При обработке типа sql_variantSQL Server поддерживает неявное преобразование объектов других типов данных в тип sql_variant. Однако SQL Server не поддерживает неявные преобразования типа sql_variant в объекты с другим типом данных.

Ограничения

В списке ниже перечислены типы значений, которые не могут сохраняться с помощью типа данных sql_variant.

  • datetimeoffset1
  • geography
  • geometry
  • hierarchyid
  • image
  • ntext
  • nvarchar(max)
  • rowversion (timestamp)
  • text
  • varchar(max)
  • varbinary(max)
  • Определяемые пользователем типы
  • xml

1 SQL Server 2012 и более поздней версии не ограничивает datetimeoffset.

Примеры

A. Использование sql_variant в таблице

В приведенном ниже примере создается таблица с типом данных sql_variant. Затем извлекаются сведения SQL_VARIANT_PROPERTY о значении colA46279.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)  

Б. Использование типа 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)