Dela via


SSVARIANT-struktur

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Ladda ned OLE DB-drivrutins

Strukturen SSVARIANT, som definieras i msoledbsql.h, motsvarar ett DBTYPE_SQLVARIANT värde i OLE DB-drivrutinen för SQL Server.

SSVARIANT är en diskriminerande union. Beroende på värdet för vt-medlemmen kan konsumenten avgöra vilken medlem som ska läsas. vt-värden motsvarar SQL Server-datatyper. Därför kan SSVARIANT- struktur innehålla valfri SQL Server-typ. Mer information om datastrukturen för ole db-standardtyper finns i Type Indicators.

Anmärkningar

När DataTypeCompat==80 blir flera SSVARIANT undertyper strängar. Följande vt-värden visas till exempel i SSVARIANT- som VT_SS_WVARSTRING:

  • VT_SS_DATETIMEOFFSET

  • VT_SS_DATETIME2

  • VT_SS_TIME2

  • VT_SS_DATE

När DateTypeCompat == 0 visas dessa typer i deras interna form.

Mer information om SSPROP_INIT_DATATYPECOMPATIBILITY finns i Using Connection String Keywords with OLE DB Driver for SQL Server.

Filen msoledbsql.h innehåller variantåtkomstmakron som förenklar dereferencing av medlemstyperna i SSVARIANT- struktur. Ett exempel är V_SS_DATETIMEOFFSET, som du kan använda på följande sätt:

memcpy(&V_SS_DATETIMEOFFSET(pssVar).tsoDateTimeOffsetVal, pDTO, cbNative);  
V_SS_DATETIMEOFFSET(pssVar).bScale = bScale;  

Den fullständiga uppsättningen åtkomstmakron för varje medlem i SSVARIANT- struktur finns i filen msoledbsql.h.

I följande tabell beskrivs medlemmarna i SSVARIANT- struktur:

Medlem Indikator för OLE DB-typ OLE DB C-datatyp vt-värde Kommentarer
Vt SSVARTYPE Anger vilken typ av värde som finns i SSVARIANT- struct.
bTinyIntVal DBTYPE_UI1 BYTE VT_SS_UI1 Stöder datatypen tinyintSQL Server.
sShortIntVal DBTYPE_I2 KORT VT_SS_I2 Stöder datatypen smallintSQL Server.
lIntVal DBTYPE_I4 LONG VT_SS_I4 Stöder datatypen intSQL Server.
llBigIntVal DBTYPE_I8 LARGE_INTEGER VT_SS_I8 Stöder datatypen bigintSQL Server.
fltRealVal DBTYPE_R4 flyttal VT_SS_R4 Stöder verkligSQL Server-datatyp.
dblFloatVal DBTYPE_R8 dubbla VT_SS_R8 Stöder flyttalSQL Server-datatyp.
cyMoneyVal DBTYPE_CY LARGE_INTEGER VT_SS_MONEY VT_SS_SMALLMONEY Stöder datatyperna pengar och smallmoneySQL Server.
fBitVal DBTYPE_BOOL VARIANT_BOOL VT_SS_BIT Stöder datatypen bitSQL Server.
rgbGuidVal DBTYPE_GUID GUID- VT_SS_GUID Stöder unikidentifierareSQL Server-datatyp.
numNumericVal DBTYPE_NUMERIC DB_NUMERIC VT_SS_NUMERIC Stöder numeriskaSQL Server-datatyp.
dDateVal DBTYPE_DATE DBDATE- VT_SS_DATE Stöder datumSQL Server-datatyp.
tsDateTimeVal DBTYPE_DBTIMESTAMP DBTIMESTAMP VT_SS_SMALLDATETIME VT_SS_DATETIME VT_SS_DATETIME2 Stöder datatyperna smalldatetime, datetimeoch datetime2SQL Server.
Time2Val DBTYPE_DBTIME2 DBTIME2 VT_SS_TIME2 Stöder tidSQL Server-datatyp.

Innehåller följande medlemmar:

tTime2Val (DBTIME2)

bScale (BYTE) Anger skalan för värdet tTime2Val.
DateTimeVal DBTYPE_DBTIMESTAMP DBTIMESTAMP VT_SS_DATETIME2 Stöder datatypen datetime2SQL Server.

Innehåller följande medlemmar:

tsDateTimeVal (DBTIMESTAMP)

bScale (BYTE) Anger skalan för tsDateTimeVal värde.
DateTimeOffsetVal DBTYPE_DBTIMESTAMPOFFSET DBTIMESTAMPOFFSET VT_SS_DATETIMEOFFSET Stöder datetimeoffsetSQL Server-datatyp.

Innehåller följande medlemmar:

tsoDateTimeOffsetVal (DBTIMESTAMPOFFSET)

bScale (BYTE) Anger skalan för tsoDateTimeOffsetVal värde.
NCharVal Ingen motsvarande OLE DB-typindikator. struct _NCharVal VT_SS_WVARSTRING,

VT_SS_WSTRING
Stöder datatyperna nchar och nvarcharSQL Server.

Innehåller följande medlemmar:

sActualLength (SHORT) Anger den faktiska längden för strängen som pwchNCharVal punkter. Inkluderar inte avslutande noll.

sMaxLength (SHORT) Anger den maximala längden för strängen som pwchNCharVal punkter.

pwchNCharVal (WCHAR *) Pekare till strängen.

rgbReserved (BYTE[5]) Anger sorteringsinformationen.

Oanvända medlemmar: dwReservedoch pwchReserved.
CharVal Ingen motsvarande OLE DB-typindikator. struct _CharVal VT_SS_STRING,

VT_SS_VARSTRING
Stöder datatyperna char och varcharSQL Server.

Innehåller följande medlemmar:

sActualLength (SHORT) Anger den faktiska längden för strängen som pchCharVal punkter. Inkluderar inte avslutande noll.

sMaxLength (SHORT) Anger den maximala längden för strängen som pchCharVal punkter.

pchCharVal (CHAR *) Pekare till strängen.

rgbReserved (BYTE[5]) Anger sorteringsinformationen.

Oanvända medlemmar:

dwReservedoch pwchReserved.
BinaryVal Ingen motsvarande OLE DB-typindikator. struct _BinaryVal VT_SS_VARBINARY,

VT_SS_BINARY
Stöder binära och varbinäraSQL Server-datatyper.

Innehåller följande medlemmar:

sActualLength (SHORT) Anger den faktiska längden för de data som prgbBinaryVal punkter.

sMaxLength (SHORT) Anger den maximala längden för de data som prgbBinaryVal punkter.

prgbBinaryVal (BYTE *) Pekare till binära data.

Oanvänd medlem: dwReserved.
UnknownType OANVÄND OANVÄND OANVÄND OANVÄND
BLOBType OANVÄND OANVÄND OANVÄND OANVÄND

Kända problem

Möjlig skada på smala strängdata

Före version 18.4 av OLE DB-drivrutinen kan infogning i en sql_variant kolumn resultera i skadade data på servern om alla följande villkor är uppfyllda:

  • Kodsidan för klientdatorn matchade inte kodsidan för databassortering.
  • Klientbufferten som ska infogas innehåller icke-ASCII-smala strängtecken som kodas på klientkodsidan.
  • Något av följande villkor var sant:
    • Fältet pwszDataSourceType i DBPARAMBINDINFO struktur som beskriver parametern som motsvarar kolumnen sql_variant har angetts till L"DBTYPE_SQLVARIANT", L"DBTYPE_VARIANT"eller L"sql_variant". Mer information finns i: ICommandWithParameters::SetParameterInfo.

      eller

    • Den parametriserade SQL-fråga som användes för infogning förbereddes.

Mer specifikt översatte OLE DB-drivrutinen inte data till sidan för databassorteringskod innan den infogas. Drivrutinen angav dock felaktigt för servern att data kodades på sidan för databassorteringskod. Det här beteendet resulterade i ett matchningsfel mellan data och motsvarande kodsida som lagras i kolumnen sql_variant.

På samma sätt översatte OLE DB-drivrutinen inte strängar till klientkodsidan när samma värde hämtades. Men eftersom de infogade data redan fanns på klientkodsidan (se stycket ovan) kunde klientprogrammet tolka data korrekt. Trots detta skulle program som använder andra drivrutiner hämta dessa värden i ett skadat format. Skadan beror på att andra drivrutiner tolkade strängen på sidan för databassorteringskod och försökte översätta den till klientkodsidan.

Från och med version 18.4 översätter OLE DB-drivrutinen de smala strängarna till sidan för databassorteringskod före infogningen. På samma sätt översätter drivrutinen tillbaka data till klientkodsidan vid hämtning. Därför kan klientprogram som förlitar sig på felet ovan uppleva problem när data som infogas med hjälp av en tidigare version av OLE DB-drivrutinen hämtas. Det återställningsförfarande som nedan syftar till att ge vägledning för att lösa dessa problem.

Återställningsprocedur

Viktig

Innan du utför återställningsstegen nedan bör du säkerhetskopiera dina befintliga data.

Om programmet har problem med att hämta data från en sql_variant kolumn efter växling till version 18.4 av OLE DB-drivrutinen måste skadade data ändras för att ha samma sortering som databasen där data lagras. Följande skript kan användas för att återställa ett enda värde från en sql_variant kolumn. Skriptet är en mall och du måste justera det så att det passar ditt scenario.

Viktig

Eftersom den ursprungliga kodsidan för data inte lagras måste du berätta för servern hur data ursprungligen kodades. Det gör du genom att köra skriptet i kontexten för en databas som har samma kodsida som kodsidan för klienten som ursprungligen infogade data. Om till exempel skadade data infogades från en klient som konfigurerats med kodsidan 932måste följande skript köras i kontexten för en databas med en japansk sortering (t.ex. Japanese_XJIS_100_CS_AI).

/*
    Description:
        Template that can be used to recover the corrupted value inserted into the sql_variant column.

    Scenario:
        The database is named [YourDatabase] and it contains a table named [YourTable], which contains the corrupted value.
        Schema is named [dbo].
        The corrupted value is stored in a column of type sql_variant named [YourColumn].
        The corrupted value is sql_variant of BaseType char. For details on sql_variant properties, see:
            https://free.blessedness.top/sql/t-sql/functions/sql-variant-property-transact-sql
*/

-- Base type in sql_variant can hold a maximum of 8000 bytes
-- For details see: 
--  https://free.blessedness.top/sql/t-sql/data-types/sql-variant-transact-sql#remarks
DECLARE @bin VARBINARY(8000)

-- In the following lines we convert the sql_variant base type to binary.
-- <FilterExpression>
--      Is a placeholder and must be replaced with an expression that filters a single corrupted value to be recovered.
--      Therefore, the expression must result in a single value being returned only.
SET @bin = (SELECT CAST([YourColumn] AS VARBINARY(8000)) FROM [YourDatabase].[dbo].[YourTable] WHERE <FilterExpression>)

-- In the following lines we store the binary value in char(59) (a fixed-size character data type).
-- IMPORTANT NOTE: 
--      This example assumes the corrupted sql_variant's base type is char(59).
--      You MUST adjust the type (that is, char/varchar) and size to match your scenario exactly.
DECLARE @char CHAR(59)
SET @char = CAST((@bin) AS CHAR(59))
DECLARE @sqlvariant sql_variant

-- The following lines recover the corrupted value by translating the value to the collation of the database.
-- <DBCollation>
--      Must be replaced with the collation (for example, Latin1_General_100_CI_AS_SC_UTF8) of the database holding the data.
SET @sqlvariant = @char collate <DBCollation>

-- Finally, we update the corrupted value with the recovered value.
-- "<FilterExpression>"
--      Is a placeholder and must be replaced with an expression that filters a single corrupted value to be recovered.
--      Therefore, the expression must result in a single value being returned only.
UPDATE [YourDatabase].[dbo].[YourTable] SET [YourColumn] = @sqlvariant WHERE <FilterExpression>

Se även

datatyper (OLE DB)