Поделиться через


sql_variant (Transact-SQL)

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

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

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

Syntax

sql_variant  

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 Approximate numeric
real Approximate numeric
decimal Exact numeric
money Exact numeric
smallmoney Exact numeric
bigint Exact numeric
int Exact numeric
smallint Exact numeric
tinyint Exact numeric
bit Exact numeric
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 данных в объект с другим типом данных.

Restrictions

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

  • datetimeoffset1
  • geography
  • geometry
  • hierarchyid
  • image
  • ntext
  • nvarchar(max)
  • rowversion (timestamp)
  • text
  • varchar(max)
  • varbinary(max)
  • User-defined types
  • xml

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

Examples

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)  

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');  

See also

CAST и CONVERT (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)