Partager via


sql_variant (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance

Type de données qui stocke les valeurs de divers types de données pris en charge par SQL Server.

Conventions de la syntaxe Transact-SQL

Syntaxe

sql_variant  

Notes

sql_variant peut être utilisé dans les colonnes, paramètres, variables et valeurs de retour des fonctions définies par l’utilisateur. sql_variant permet à ces objets de base de données de prendre en charge les valeurs des autres types de données.

Une colonne de type sql_variant peut contenir des lignes de types de données différents. Par exemple, une colonne définie en tant que sql_variant peut stocker des valeurs int, binary et char.

sql_variant peut avoir une longueur maximale de 8 016 octets. Cela inclut les informations du type de base et la valeur du type de base. La longueur maximale de la valeur de type de base réelle est de 8 000 octets.

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.

Il est possible d’attribuer une valeur par défaut à sql_variant. 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. En outre, sql_variant ne peut pas avoir un autre type sql_variant comme type de base.

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. Cette longueur est de 900 octets.

Une table peut inclure n’importe quel nombre de colonnes sql_variant.

sql_variant ne peut pas être utilisé dans les instructions CONTAINSTABLE ni FREETEXTTABLE.

ODBC ne prend pas pleinement en charge le type 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). Par exemple, une colonne sql_variant contenant les données de chaîne de caractères « PS2091 » est retournée sous la forme 0x505332303931.

Comparaison des valeurs sql_variant

Le type de données sql_variant est situé tout en haut de la hiérarchie des types de données pour la conversion. Pour les comparaisons sql_variant, la hiérarchie des types de données SQL Server est ordonnée en familles.

Hiérarchie des types de données Famille de types de données
sql_variant sql_variant
datetime2 Date et heure
datetimeoffset Date et heure
datetime Date et heure
smalldatetime Date et heure
date Date et heure
time Date et heure
float Valeur numérique approchée
real Valeur numérique approchée
decimal Valeur numérique exacte
money Valeur numérique exacte
smallmoney Valeur numérique exacte
bigint Valeur numérique exacte
int Valeur numérique exacte
smallint Valeur numérique exacte
tinyint Valeur numérique exacte
bit Valeur numérique exacte
nvarchar Unicode
nchar Unicode
varchar Unicode
char Unicode
varbinary Binary
binary Binary
uniqueidentifier Uniqueidentifier

Les règles suivantes s’appliquent aux comparaisons sql_variant :

  • 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.
  • 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.
  • 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. Chacun de ces critères est comparé en tant que valeur entières, dans l'ordre indiqué. Si tous ces critères sont égaux, les valeurs de chaîne réelles sont comparées d'après le classement.

Conversion de données sql_variant

Lors de la gestion du type de données sql_variant, SQL Server prend en charge les conversions implicites d’objets avec d’autres types de données en type sql_variant. Cependant, SQL 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.

Restrictions

Voici les types de valeurs qui ne peuvent pas être stockées en utilisant sql_variant :

  • datetimeoffset1
  • Geography
  • geometry
  • hierarchyid
  • image
  • ntext
  • nvarchar(max)
  • rowversion (timestamp)
  • text
  • varchar(max)
  • varbinary(max)
  • Types définis par l'utilisateur
  • xml

1 SQL Server versions 2012 et supérieures ne restreignent pas datetimeoffset.

Exemples

R. Utilisation d’un type sql_variant dans une table

L’exemple suivant crée une table avec un type de données sql_variant. L’exemple récupère ensuite des informations SQL_VARIANT_PROPERTY relatives à la valeur colA46279.1colB =1689, étant donné que tableA a la valeur colA de type sql_variant et 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 le jeu de résultats. Notez que chacune de ces trois valeurs est de type sql_variant.

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

B. Utilisation d’un type sql_variant comme 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.

DECLARE @v1 sql_variant;  
SET @v1 = 'ABC';  
SELECT @v1;  
SELECT SQL_VARIANT_PROPERTY(@v1, 'BaseType');  
SELECT SQL_VARIANT_PROPERTY(@v1, 'MaxLength');  

Voir aussi

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