Dela via


sql_variant (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

En datatyp som lagrar värden för olika SQL Server-datatyper som stöds.

Transact-SQL syntaxkonventioner

Syntax

sql_variant  

Anmärkningar

sql_variant kan användas i kolumner, parametrar, variabler och returvärden för användardefinierade funktioner. sql_variant gör det möjligt för dessa databasobjekt att stödja värden för andra datatyper.

En kolumn av typen sql_variant kan innehålla rader med olika datatyper. En kolumn som definieras som sql_variant kan till exempel lagra int, binäroch tecken värden.

sql_variant kan ha en maximal längd på 8016 byte. Detta omfattar både bastypsinformationen och bastypsvärdet. Den maximala längden på det faktiska bastypsvärdet är 8 000 byte.

En sql_variant datatyp måste först överföras till dess basvärde för datatyp innan den deltar i åtgärder som addition och subtraktion.

sql_variant kan tilldelas ett standardvärde. Den här datatypen kan också ha NULL som underliggande värde, men NULL-värdena har ingen associerad bastyp. Dessutom kan sql_variant inte ha någon annan sql_variant som bastyp.

En unik, primär eller sekundärnyckel kan innehålla kolumner av typen sql_variant, men den totala längden på de datavärden som utgör nyckeln för en viss rad får inte vara mer än den maximala längden på ett index. Det här är 900 byte.

En tabell kan ha valfritt antal sql_variant kolumner.

sql_variant kan inte användas i CONTAINSTABLE och FREETEXTTABLE.

ODBC stöder inte helt sql_variant. Därför returneras frågor om sql_variant kolumner som binära data när du använder Microsoft OLE DB-providern för ODBC (MSDASQL). Till exempel returneras en sql_variant kolumn som innehåller teckensträngsdata "PS2091" som 0x505332303931.

Jämföra sql_variant värden

Den sql_variant datatypen tillhör överst i hierarkilistan för datatyp för konvertering. För sql_variant jämförelser grupperas hierarkiordningen för SQL Server-datatyp i datatypsfamiljer.

Datatypshierarki Datatypfamilj
sql_variant sql_variant
datetime2 Datum och tid
datetimeoffset Datum och tid
datetime Datum och tid
smalldatetime Datum och tid
datum Datum och tid
tid Datum och tid
flyttal Ungefärlig numerisk
riktiga Ungefärlig numerisk
decimal Exakta numeriska
pengar Exakta numeriska
smallmoney Exakta numeriska
bigint Exakta numeriska
int Exakta numeriska
liten Exakta numeriska
pytteliten Exakta numeriska
bit Exakta numeriska
nvarchar Unicode
nchar Unicode
varchar Unicode
tecken Unicode
varbinary Binär
binär Binär
unikidentifierare Unikidentifierare

Följande regler gäller för sql_variant jämförelser:

  • När sql_variant värden för olika basdatatyper jämförs och basdatatyperna finns i olika datatypsfamiljer anses värdet vars datatypfamilj är högre i hierarkidiagrammet vara större av de två värdena.
  • När sql_variant värden för olika basdatatyper jämförs och basdatatyperna finns i samma datatypfamilj konverteras värdet vars basdatatyp är lägre i hierarkidiagrammet implicit till den andra datatypen och jämförelsen görs sedan.
  • När sql_variant värden för tecken, varchar, nchareller nvarchar datatyper jämförs först deras sortering baserat på följande kriterier: LCID, LCID-version, jämförelseflaggor och sorterings-ID. Vart och ett av dessa kriterier jämförs som heltalsvärden och i den ordning som anges. Om alla dessa villkor är lika jämförs de faktiska strängvärdena enligt sorteringen.

Konvertera sql_variant data

När du hanterar sql_variant datatypen stöder SQL Server implicita konverteringar av objekt med andra datatyper till sql_variant typen. SQL Server stöder dock inte implicita konverteringar från sql_variant data till ett objekt med en annan datatyp.

Inskränkningar

Följande visar de typer av värden som inte kan lagras med hjälp av sql_variant:

  • datetimeoffset1
  • geografi
  • geometri
  • hierarchyid
  • bild
  • ntext
  • nvarchar(max)
  • rowversion (tidsstämpel)
  • text
  • varchar(max)
  • varbinary(max)
  • Användardefinierade typer
  • XML-

1 SQL Server 2012 och senare begränsar inte datetimeoffset.

Exempel

A. Använda en sql_variant i en tabell

I följande exempel skapas en tabell med en sql_variant datatyp. Sedan hämtar exemplet SQL_VARIANT_PROPERTY information om colA-värdet 46279.1 där colB =1689, eftersom tableA har colA som är av typen sql_variant och 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  

Här är resultatuppsättningen. Observera att vart och ett av dessa tre värden är en sql_variant.

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

B. Använda en sql_variant som en variabel

I följande exempel skapas en variabel med datatypen sql_variant och hämtar sedan SQL_VARIANT_PROPERTY information om en variabel med namnet @v1.

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

Se även

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