sql_variant (Transact-SQL)sql_variant (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Тип данных, хранящий значения различных типов данных, поддерживаемых SQL ServerSQL Server.A data type that stores values of various SQL ServerSQL Server-supported data types.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

sql_variant  

RemarksRemarks

sql_variant может использоваться в столбцах, параметрах, переменных и значениях, возвращаемых определяемыми пользователем функциями.sql_variant can be used in columns, parameters, variables, and the return values of user-defined functions. sql_variant позволяет этим объектам баз данных поддерживать значения других типов данных.sql_variant enables these database objects to support values of other data types.

Столбец типа sql_variant может содержать строки различных типов данных.A column of type sql_variant may contain rows of different data types. Например, в столбце, определенном как sql_variant, могут храниться значения int, binary и char.For example, a column defined as sql_variant can store int, binary, and char values.

Максимальная длина значения типа данных sql_variant составляет 8016 байт.sql_variant can have a maximum length of 8016 bytes. Сюда входят сведения о базовом типе и значение базового типа.This includes both the base type information and the base type value. Максимальная длина значения соответствующего базового типа составляет 8 000 байт.The maximum length of the actual base type value is 8,000 bytes.

Перед тем как задействовать тип данных sql_variant в таких операциях, как сложение и вычитание, его нужно привести к значению базового типа данных.A sql_variant data type must first be cast to its base data type value before participating in operations such as addition and subtraction.

Типу данных sql_variant может быть присвоено значение по умолчанию.sql_variant can be assigned a default value. Этот тип данных в качестве значения может содержать значение NULL, однако значению NULL не будет соответствовать базовый тип.This data type can also have NULL as its underlying value, but the NULL values will not have an associated base type. Кроме того, тип данных sql_variant не может в качестве базового иметь другой тип данных sql_variant.Also, sql_variant cannot have another sql_variant as its base type.

Уникальный, первичный или внешний ключ может содержать столбцы типа sql_variant, но общая длина значений данных, составляющих ключ определенной строки, не должна превышать максимальную длину индекса.A unique, primary, or foreign key may include columns of type sql_variant, but the total length of the data values that make up the key of a specific row should not be more than the maximum length of an index. Эта длина составляет 900 байт.This is 900 bytes.

Таблица может иметь любое количество столбцов типа sql_variant.A table can have any number of sql_variant columns.

Тип sql_variant нельзя использовать в инструкциях CONTAINSTABLE и FREETEXTTABLE.sql_variant cannot be used in CONTAINSTABLE and FREETEXTTABLE.

Протокол ODBC поддерживает тип sql_variant не полностью.ODBC does not fully support sql_variant. Поэтому столбцы типа sql_variant, запрашиваемые через поставщик Microsoft OLE DB для ODBC (MSDASQL), возвращаются в виде двоичных данных.Therefore, queries of sql_variant columns are returned as binary data when you use Microsoft OLE DB Provider for ODBC (MSDASQL). Например, столбец типа sql_variant, содержащий строку "PS2091", возвращается в виде 0x505332303931.For example, a sql_variant column that contains the character string data 'PS2091' is returned as 0x505332303931.

Сравнение значений sql_variantComparing sql_variant Values

Тип sql_variant находится на вершине иерархического списка преобразования типов данных.The sql_variant data type belongs to the top of the data type hierarchy list for conversion. Для сравнения данных типа sql_variant иерархия типов данных SQL ServerSQL Server разбивается на семейства типов.For sql_variant comparisons, the SQL ServerSQL Server data type hierarchy order is grouped into data type families.

Иерархия типов данныхData type hierarchy Семейство типов данныхData type family
sql_variantsql_variant sql_variantsql_variant
datetime2datetime2 Дата и времяDate and time
datetimeoffsetdatetimeoffset Дата и времяDate and time
datetimedatetime Дата и времяDate and time
smalldatetimesmalldatetime Дата и времяDate and time
datedate Дата и времяDate and time
timetime Дата и времяDate and time
floatfloat Приблизительное числовое значениеApproximate numeric
realreal Приблизительное числовое значениеApproximate numeric
decimaldecimal Точное числовое значениеExact numeric
moneymoney Точное числовое значениеExact numeric
smallmoneysmallmoney Точное числовое значениеExact numeric
bigintbigint Точное числовое значениеExact numeric
intint Точное числовое значениеExact numeric
smallintsmallint Точное числовое значениеExact numeric
tinyinttinyint Точное числовое значениеExact numeric
bitbit Точное числовое значениеExact numeric
nvarcharnvarchar ЮникодUnicode
ncharnchar ЮникодUnicode
varcharvarchar ЮникодUnicode
charchar ЮникодUnicode
varbinaryvarbinary ДвоичныйBinary
binarybinary ДвоичныйBinary
uniqueidentifieruniqueidentifier Уникальный идентификаторUniqueidentifier

К сравнениям типов sql_variant применяются указанные ниже правила.The following rules apply to sql_variant comparisons:

  • При сравнении значений sql_variant различных базовых типов данных, находящихся в разных семействах типов данных, большим из двух значений считается то, семейство типа данных которого находится выше в иерархии.When sql_variant values of different base data types are compared and the base data types are in different data type families, the value whose data type family is higher in the hierarchy chart is considered the greater of the two values.
  • При сравнении значений sql_variant различных базовых типов данных, находящихся в одном семействе типов данных, значение, базовый тип данных которого находится ниже в иерархии, неявно приводится к другому типу данных, после чего производится сравнение.When sql_variant values of different base data types are compared and the base data types are in the same data type family, the value whose base data type is lower in the hierarchy chart is implicitly converted to the other data type and the comparison is then made.
  • При сравнении значений sql_variant с типами данных char, varchar, nchar или nvarchar их параметры сортировки сначала сравниваются на основе следующих критериев: код языка, версия кода языка, флаги сравнения и идентификатор сортировки.When sql_variant values of the char, varchar, nchar, or nvarchar data types are compared, their collations are first compared based on the following criteria: LCID, LCID version, comparison flags, and sort ID. Каждый из этих критериев сравнивается как целочисленное значение в приведенном порядке.Each of these criteria are compared as integer values, and in the order listed. Если все эти критерии равны, то сами строковые значения сравниваются в соответствии с параметрами сортировки.If all of these criteria are equal, then the actual string values are compared according to the collation.

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

При обработке типа sql_variant SQL ServerSQL Server поддерживает неявное преобразование объектов других типов данных в тип sql_variant.When handling the sql_variant data type, SQL ServerSQL Server supports implicit conversions of objects with other data types to the sql_variant type. Однако SQL ServerSQL Server не поддерживает неявные преобразования типа sql_variant в объекты с другим типом данных.However, SQL ServerSQL Server does not support implicit conversions from sql_variant data to an object with another data type.

ОграниченияRestrictions

В приведенной ниже таблице перечислены типы значений, которые не могут сохраняться с помощью типа данных sql_variant.The following table lists the types of values that cannot be stored by using sql_variant:

varchar(max)varchar(max) varbinary(max)varbinary(max)
nvarchar(max)nvarchar(max) xmlxml
texttext ntextntext
imageimage rowversion (timestamp)rowversion (timestamp)
sql_variantsql_variant geographygeography
hierarchyidhierarchyid geometrygeometry
Определяемые пользователем типыUser-defined types datetimeoffset1datetimeoffset1

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

ПримерыExamples

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

В приведенном ниже примере создается таблица с типом данных sql_variant.The following example, creates a table with a sql_variant data type. Затем извлекаются сведения SQL_VARIANT_PROPERTY о значении colA 46279.1, где colB =1689, при условии, что tableA имеет colA типа sql_variant и colB.Then the example retrieves SQL_VARIANT_PROPERTY information about the colA value 46279.1 where colB =1689, given that tableA has colA that is of type sql_variant and 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  

Ниже приводится результирующий набор.Here is the result set. Обратите внимание на то, что каждое из этих трех значений имеет тип sql_variant.Note that each of these three values is a sql_variant.

Base Type    Precision    Scale  
---------    ---------    -----  
decimal      8           2  
  
(1 row(s) affected)  

Б.B. Использование типа sql_variant в качестве переменнойUsing a sql_variant as a variable

В приведенном ниже примере создается переменная с помощью типа данных sql_variant, а затем извлекаются сведения SQL_VARIANT_PROPERTY о переменной с именем @v1.The following example, creates a variable using the sql_variant data type, and then retrieves SQL_VARIANT_PROPERTY information about a variable named @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)CAST and CONVERT (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)SQL_VARIANT_PROPERTY (Transact-SQL)