sql_variant (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Ein Datentyp, der Werte verschiedener von SQL Server unterstützter Datentypen speichert.

Transact-SQL-Syntaxkonventionen

Syntax

sql_variant  

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

Hinweise

sql_variant kann in Spalten, Parametern, Variablen und Rückgabewerten von benutzerdefinierten Funktionen verwendet werden. sql_variant ermöglicht, dass diese Datenbankobjekte auch Werte mit anderen Datentypen unterstützen.

Eine Spalte vom Datentyp sql_variant enthält möglicherweise Zeilen verschiedener Datentypen. Beispielsweise können in einer als sql_variant definierten Spalte die Werte int, binary und char gespeichert sein.

sql_variant kann eine maximale Länge von 8016 Bytes besitzen. Dies schließt sowohl die Basistypinformationen als auch den Basistypwert ein. Die maximale Länge des Basistypwerts ist 8.000 Byte.

Ein sql_variant-Datentyp muss zuerst in den Wert seines Basisdatentyps umgewandelt werden, bevor er in Operationen, beispielsweise Addition oder Subtraktion, verwendet werden kann.

sql_variant kann ein Standardwert zugewiesen werden. Dieser Datentyp kann auch NULL als zugrunde liegenden Wert haben, den NULL-Werten ist jedoch kein Basistyp zugeordnet. Außerdem kann sql_variant nicht der Basistyp für einen andren sql_variant-Datentyp sein.

Eindeutige Schlüssel sowie Primär- oder Fremdschlüssel können Spalten vom Datentyp sql_variant enthalten. Die Gesamtlänge der Datenwerte, aus denen ein Schlüssel für eine vorhandene Zeile besteht, sollte jedoch die maximale Länge eines Index nicht überschreiten. Diese beträgt 900 Bytes.

Eine Tabelle kann über eine beliebige Anzahl von sql_variant-Spalten verfügen.

sql_variant kann nicht in CONTAINSTABLE und FREETEXTTABLE verwendet werden.

ODBC unterstützt sql_variant nicht vollständig. Deshalb werden Abfragen von sql_variant-Spalten bei Verwendung von Microsoft OLE DB-Anbietern für ODBC (MSDASQL) als Binärdaten zurückgegeben. Eine sql_variant-Spalte mit den Zeichenfolgendaten „PS2091“ wird als 0x505332303931 zurückgegeben.

Vergleichen von sql_variant-Werten

Der sql_variant-Datentyp steht im oberen Bereich in der Hierarchieliste der Datentypen für die Konvertierung. Für sql_variant-Vergleiche wird die Reihenfolge der Datentyphierarchie von SQL Server in Datentypfamilien unterteilt.

Datentyphierarchie Datentypfamilie
sql_variant sql_variant
datetime2 Datum und Uhrzeit
datetimeoffset Datum und Uhrzeit
datetime Datum und Uhrzeit
smalldatetime Datum und Uhrzeit
date Datum und Uhrzeit
time Datum und Uhrzeit
float Ungefährer numerischer Wert
real Ungefährer numerischer Wert
decimal Genauer numerischer Wert
money Genauer numerischer Wert
smallmoney Genauer numerischer Wert
bigint Genauer numerischer Wert
int Genauer numerischer Wert
smallint Genauer numerischer Wert
tinyint Genauer numerischer Wert
bit Genauer numerischer Wert
nvarchar Unicode
nchar Unicode
varchar Unicode
char Unicode
varbinary Binary
binary Binary
uniqueidentifier Uniqueidentifier

Für sql_variant-Vergleiche gelten die folgenden Regeln:

  • Wenn sql_variant-Werte unterschiedlicher Basisdatentypen verglichen werden und die Basisdatentypen verschiedenen Datentypfamilien angehören, wird der Wert als der höhere eingestuft, dessen Datentypfamilie sich weiter oben in der Hierarchieliste befindet.
  • Wenn sql_variant-Werte unterschiedlicher Basisdatentypen verglichen werden und die Basisdatentypen derselben Datentypfamilie angehören, wird der Wert, dessen Basisdatentyp sich weiter unten in der Hierarchieliste befindet, implizit in den anderen Datentyp konvertiert, und dann wird der Vergleich durchgeführt.
  • Wenn sql_variant-Werte der Datentypen char, varchar, nchar oder nvarchar verglichen werden, stützt sich der Vergleich zunächst auf folgende Kriterien: LCID, LCID-Version, Vergleichsflags und Sortier-ID. Diese Kriterien werden als ganzzahlige Werte und in der genannten Reihenfolge verglichen. Sind alle diese Kriterien gleich, werden die tatsächlichen Zeichenfolgenwerte entsprechend der Sortierreihenfolge verglichen.

Konvertieren von sql_variant-Daten

Bei der Verarbeitung von sql_variant-Datentypen unterstützt SQL Server die impliziten Konvertierungen von Objekten mit anderen Datentypen in den Typ sql_variant. SQL Server unterstützt jedoch keine impliziten Konvertierungen von sql_variant-Daten in ein Objekt mit einem anderen Datentyp.

Beschränkungen

Im Folgenden werden die Typen von Werten aufgelistet, die nicht mithilfe von sql_variant gespeichert werden können:

  • datetimeoffset1
  • geography
  • geometry
  • hierarchyid
  • image
  • ntext
  • nvarchar(max)
  • rowversion (timestamp)
  • text
  • varchar(max)
  • varbinary(max)
  • Benutzerdefinierte Typen
  • xml

1 Bei SQL Server 2012 und höher ist datetimeoffset nicht eingeschränkt.

Beispiele

A. Verwenden von „sql_variant“ in einer Tabelle

Im folgenden Beispiel wird eine Tabelle mit einem sql_variant-Datentyp erstellt. Dann wird im Beispiel SQL_VARIANT_PROPERTY-Informationen über den colA-Wert 46279.1 abgerufen, wobei colB =1689 und tableA über colA vom Typ sql_variant und colB verfügt.

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  

Hier ist das Resultset. Beachten Sie, dass jeder dieser drei Werte vom Datentyp sql_variant ist.

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

B. Verwenden von „sql_variant“ als Variable

Das folgende Beispiel erstellt eine Variable unter Verwendung des sql_variant-Datentyps und ruft dann SQL_VARIANT_PROPERTY-Informationen zu einer Variable mit dem Namen @v1 ab.

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

Weitere Informationen

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