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

S’APPLIQUE À : ouiSQL Server ouiAzure SQL Database nonAzure SQL Data Warehouse nonParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Type de données qui stocke les valeurs de divers types de données pris en charge par SQL ServerSQL Server.A data type that stores values of various SQL ServerSQL Server-supported data types.

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax

sql_variant  

NotesRemarks

sql_variant peut être utilisé dans les colonnes, paramètres, variables et valeurs de retour des fonctions définies par l’utilisateur.sql_variant can be used in columns, parameters, variables, and the return values of user-defined functions. sql_variant permet à ces objets de base de données de prendre en charge les valeurs des autres types de données.sql_variant enables these database objects to support values of other data types.

Une colonne de type sql_variant peut contenir des lignes de types de données différents.A column of type sql_variant may contain rows of different data types. Par exemple, une colonne définie en tant que sql_variant peut stocker des valeurs int, binary et char.For example, a column defined as sql_variant can store int, binary, and char values.

sql_variant peut avoir une longueur maximale de 8 016 octets.sql_variant can have a maximum length of 8016 bytes. Cela inclut les informations du type de base et la valeur du type de base.This includes both the base type information and the base type value. La longueur maximale de la valeur de type de base réelle est de 8 000 octets.The maximum length of the actual base type value is 8,000 bytes.

Un type de données sql_variant doit d’abord être converti en sa valeur de base avant d’être utilisé dans des opérations, notamment l’addition et la soustraction.A sql_variant data type must first be cast to its base data type value before participating in operations such as addition and subtraction.

Il est possible d’attribuer une valeur par défaut à sql_variant.sql_variant can be assigned a default value. Ce type de données accepte également les valeurs NULL comme valeurs sous-jacentes, mais ces dernières ne seront pas associées à un type de base.This data type can also have NULL as its underlying value, but the NULL values will not have an associated base type. En outre, sql_variant ne peut pas avoir un autre type sql_variant comme type de base.Also, sql_variant cannot have another sql_variant as its base type.

Une clé unique, primaire ou étrangère peut inclure des colonnes de type sql_variant, mais la longueur totale des valeurs de données qui composent la clé d’une ligne spécifique ne doit pas être supérieure à la longueur maximale d’un index.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. Cette longueur est de 900 octets.This is 900 bytes.

Une table peut inclure n’importe quel nombre de colonnes sql_variant.A table can have any number of sql_variant columns.

sql_variant ne peut pas être utilisé dans les instructions CONTAINSTABLE ni FREETEXTTABLE.sql_variant cannot be used in CONTAINSTABLE and FREETEXTTABLE.

ODBC ne prend pas pleinement en charge le type sql_variant.ODBC does not fully support sql_variant. Par conséquent, les requêtes des colonnes sql_variant sont retournées sous la forme de données binaires quand vous utilisez le fournisseur Microsoft OLE DB pour ODBC (MSDASQL).Therefore, queries of sql_variant columns are returned as binary data when you use Microsoft OLE DB Provider for ODBC (MSDASQL). Par exemple, une colonne sql_variant contenant les données de chaîne de caractères « PS2091 » est retournée sous la forme 0x505332303931.For example, a sql_variant column that contains the character string data 'PS2091' is returned as 0x505332303931.

Comparaison des valeurs sql_variantComparing sql_variant Values

Le type de données sql_variant est situé tout en haut de la hiérarchie des types de données pour la conversion.The sql_variant data type belongs to the top of the data type hierarchy list for conversion. Pour les comparaisons sql_variant, la hiérarchie des types de données SQL ServerSQL Server est ordonnée en familles.For sql_variant comparisons, the SQL ServerSQL Server data type hierarchy order is grouped into data type families.

Hiérarchie des types de donnéesData type hierarchy Famille de types de donnéesData type family
sql_variantsql_variant sql_variantsql_variant
datetime2datetime2 Date et heureDate and time
datetimeoffsetdatetimeoffset Date et heureDate and time
datetimedatetime Date et heureDate and time
smalldatetimesmalldatetime Date et heureDate and time
datedate Date et heureDate and time
timetime Date et heureDate and time
floatfloat Valeur numérique approchéeApproximate numeric
realreal Valeur numérique approchéeApproximate numeric
decimaldecimal Valeur numérique exacteExact numeric
moneymoney Valeur numérique exacteExact numeric
smallmoneysmallmoney Valeur numérique exacteExact numeric
bigintbigint Valeur numérique exacteExact numeric
Intint Valeur numérique exacteExact numeric
smallintsmallint Valeur numérique exacteExact numeric
tinyinttinyint Valeur numérique exacteExact numeric
bitbit Valeur numérique exacteExact numeric
nvarcharnvarchar UnicodeUnicode
ncharnchar UnicodeUnicode
varcharvarchar UnicodeUnicode
charchar UnicodeUnicode
varbinaryvarbinary BinaireBinary
binairebinary BinaireBinary
uniqueidentifieruniqueidentifier UniqueidentifierUniqueidentifier

Les règles suivantes s’appliquent aux comparaisons sql_variant :The following rules apply to sql_variant comparisons:

  • Lors de la comparaison des valeurs sql_variant issues de différents types de données de base appartenant à des familles de types de données différentes, la valeur de la famille dont le rang est supérieur dans la hiérarchie est considérée comme la valeur la plus élevée des deux.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.
  • Lors de la comparaison des valeurs sql_variant issues de différents types de données de base appartenant à la même famille, la valeur du type dont le rang est inférieur dans la hiérarchie est implicitement convertie en l’autre type de données et la comparaison est alors effectuée.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.
  • Quand les valeurs sql_variant des types de données char, varchar, nchar ou nvarchar sont comparées, leurs classements sont d’abord comparés d’après les critères suivants : LCID, version LCID, indicateurs de comparaison et ID de tri.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. Chacun de ces critères est comparé en tant que valeur entières, dans l'ordre indiqué.Each of these criteria are compared as integer values, and in the order listed. Si tous ces critères sont égaux, les valeurs de chaîne réelles sont comparées d'après le classement.If all of these criteria are equal, then the actual string values are compared according to the collation.

Conversion de données sql_variantConverting sql_variant Data

Lors de la gestion du type de données sql_variant, SQL ServerSQL Server prend en charge les conversions implicites d’objets avec d’autres types de données en type 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. Cependant, SQL ServerSQL Server ne prend pas en charge les conversions implicites de données sql_variant en un objet possédant un autre type de données.However, SQL ServerSQL Server does not support implicit conversions from sql_variant data to an object with another data type.

RestrictionsRestrictions

Le tableau suivant répertorie les types de valeurs qui ne peuvent pas être stockées en utilisant 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
textetext ntextntext
imageimage rowversion (timestamp)rowversion (timestamp)
sql_variantsql_variant geographygeography
hierarchyidhierarchyid geometrygeometry
Types définis par l'utilisateurUser-defined types datetimeoffset1datetimeoffset1

1 SQL Server versions 2012 et supérieures ne restreignent pas datetimeoffset.1 SQL Server 2012 and greater do not restrict datetimeoffset.

ExemplesExamples

A.A. Utilisation d’un type sql_variant dans une tableUsing a sql_variant in a table

L’exemple suivant crée une table avec un type de données sql_variant.The following example, creates a table with a sql_variant data type. L’exemple récupère ensuite des informations SQL_VARIANT_PROPERTY relatives à la valeur colA 46279.1colB =1689, étant donné que tableA a la valeur colA de type sql_variant et 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  

Voici l'ensemble des résultats.Here is the result set. Notez que chacune de ces trois valeurs est de type 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.B. Utilisation d’un type sql_variant comme variableUsing a sql_variant as a variable

L’exemple suivant crée une variable avec le type de données sql_variant et récupère ensuite des informations SQL_VARIANT_PROPERTY sur une variable nommée @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');  

Voir aussiSee also

CAST et CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)SQL_VARIANT_PROPERTY (Transact-SQL)