sql_variant (Transact-SQL)
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-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)