sql_variant (Transact-SQL)

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

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

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

Синтаксис

sql_variant  

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Замечания

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 о значении 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)  

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)