Udostępnij za pomocą


sql_variant (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Typ danych, który przechowuje wartości różnych typów danych obsługiwanych przez program SQL Server.

Transact-SQL konwencje składni

Syntax

sql_variant  

Remarks

sql_variant można używać w kolumnach, parametrach, zmiennych i zwracanych wartościach funkcji zdefiniowanych przez użytkownika. sql_variant umożliwia tym obiektom bazy danych obsługę wartości innych typów danych.

Kolumna typu sql_variant może zawierać wiersze różnych typów danych. Na przykład kolumna zdefiniowana jako sql_variant może przechowywać , wartości binarnei wartości znaków.

sql_variant może mieć maksymalną długość 8016 bajtów. Obejmuje to zarówno informacje o typie podstawowym, jak i wartość typu podstawowego. Maksymalna długość rzeczywistego typu podstawowego wynosi 8000 bajtów.

Przed udziałem w operacjach, takich jak dodawanie i odejmowanie, należy najpierw rzutować sql_variant typ danych na wartość podstawowego typu danych.

sql_variant można przypisać wartość domyślną. Ten typ danych może również mieć wartość NULL jako wartość bazową, ale wartości NULL nie będą miały skojarzonego typu podstawowego. Ponadto sql_variant nie może mieć innego sql_variant jako typu podstawowego.

Unikatowy, podstawowy lub obcy klucz może zawierać kolumny typu sql_variant, ale łączna długość wartości danych tworzących klucz określonego wiersza nie powinna być większa niż maksymalna długość indeksu. Jest to 900 bajtów.

Tabela może zawierać dowolną liczbę kolumn sql_variant.

sql_variant nie można używać w tabelach CONTAINSTABLE i FREETEXTTABLE.

OdBC nie obsługuje w pełni sql_variant. W związku z tym zapytania dotyczące kolumn sql_variant są zwracane jako dane binarne podczas korzystania z dostawcy Microsoft OLE DB dla ODBC (MSDASQL). Na przykład kolumna sql_variant zawierająca dane ciągu znaków "PS2091" jest zwracana jako 0x505332303931.

Porównywanie wartości sql_variant

Typ danych sql_variant należy do górnej części listy hierarchii typów danych na potrzeby konwersji. W przypadku porównań sql_variant kolejność hierarchii typów danych programu SQL Server jest pogrupowana w rodziny typów danych.

Hierarchia typów danych Rodzina typów danych
sql_variant sql_variant
datetime2 Data i godzina
datetimeoffset Data i godzina
datetime Data i godzina
smalldatetime Data i godzina
date Data i godzina
time Data i godzina
float Przybliżona numeryka
real Przybliżona numeryka
decimal Dokładna liczba
money Dokładna liczba
smallmoney Dokładna liczba
bigint Dokładna liczba
int Dokładna liczba
smallint Dokładna liczba
tinyint Dokładna liczba
bit Dokładna liczba
nvarchar Unicode
nchar Unicode
varchar Unicode
char Unicode
varbinary Binary
binary Binary
uniqueidentifier Uniqueidentifier

Następujące reguły dotyczą porównań sql_variant:

  • Gdy sql_variant wartości różnych podstawowych typów danych są porównywane, a podstawowe typy danych znajdują się w różnych rodzinach typów danych, wartość, której rodzina typów danych jest wyższa na wykresie hierarchii, jest uważana za większą z dwóch wartości.
  • Gdy sql_variant wartości różnych podstawowych typów danych są porównywane, a podstawowe typy danych znajdują się w tej samej rodzinie typów danych, wartość, której podstawowy typ danych jest niższy na wykresie hierarchii, jest niejawnie konwertowany na inny typ danych, a następnie jest wykonywane porównanie.
  • Gdy sql_variant wartościchar , varchar, ncharlub nvarchar typy danych są porównywane, ich sortowania są najpierw porównywane na podstawie następujących kryteriów: LCID, wersja LCID, LCID, flagi porównania i identyfikator sortowania. Każde z tych kryteriów jest porównywane jako wartości całkowite i w podanej kolejności. Jeśli wszystkie te kryteria są równe, rzeczywiste wartości ciągu są porównywane zgodnie z sortowaniem.

Konwertowanie danych sql_variant

W przypadku obsługi typu danych sql_variant program SQL Server obsługuje niejawne konwersje obiektów z innymi typami danych na typ sql_variant. Jednak program SQL Server nie obsługuje niejawnych konwersji z sql_variant danych do obiektu z innym typem danych.

Restrictions

Poniżej wymieniono typy wartości, których nie można przechowywać przy użyciu sql_variant:

  • datetimeoffset1
  • geography
  • geometry
  • hierarchyid
  • image
  • ntext
  • nvarchar(max)
  • Wersja wiersza (znacznik czasu)
  • text
  • varchar(max)
  • varbinary(max)
  • Typy zdefiniowane przez użytkownika
  • xml

1 PROGRAMU SQL Server 2012 i nowszych nie ograniczają datetimeoffset.

Examples

A. Używanie sql_variant w tabeli

W poniższym przykładzie zostanie utworzona tabela z typem danych sql_variant. Następnie przykład pobiera SQL_VARIANT_PROPERTY informacje o wartości colA46279.1 gdzie colB =1689, biorąc pod uwagę, że tableA ma colA typu sql_variant i 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  

Oto zestaw wyników. Należy pamiętać, że każda z tych trzech wartości jest sql_variant.

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

B. Używanie sql_variant jako zmiennej

Poniższy przykład tworzy zmienną przy użyciu typu danych sql_variant, a następnie pobiera SQL_VARIANT_PROPERTY informacje o zmiennej o nazwie @v1.

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

Zobacz także

RZUTOWANIE i konwertowanie (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)