Teilen über


SSVARIANT-Struktur

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

OLE DB-Treiber herunterladen

Die in „msoledbsql.h“ definierte SSVARIANT-Struktur entspricht einem DBTYPE_SQLVARIANT-Wert im OLE DB-Treiber für SQL Server.

SSVARIANT ist eine unterscheidende Union. Abhängig vom Wert des vt-Elements kann der Consumer feststellen, welches Element gelesen werden soll. vt-Werte entsprechen SQL Server-Datentypen. Die SSVARIANT-Struktur kann daher jeden SQL Server-Typ enthalten. Weitere Informationen zur Datenstruktur für standardmäßige OLE DB-Typen finden Sie unter Typindikatoren.

Bemerkungen

Wenn DataTypeCompat auf „80“ festgelegt ist, werden verschiedene SSVARIANT-Untertypen zu Zeichenfolgen. Beispielsweise werden die folgenden vt-Werte in SSVARIANT als VT_SS_WVARSTRING angezeigt:

  • VT_SS_DATETIMEOFFSET

  • VT_SS_DATETIME2

  • VT_SS_TIME2

  • VT_SS_DATE

Wenn DateTypeCompat auf "0" festgelegt ist, werden diese Typen in ihrer systemeigenen Form angezeigt.

Weitere Informationen zu SSPROP_INIT_DATATYPECOMPATIBILITY finden Sie unter Verwenden von Verbindungszeichenfolgen-Schlüsselwörtern mit dem OLE DB-Treiber für SQL Server.

Die Datei „msoledbsql.h“ enthält VARIANT-Zugriffsmakros, die das Dereferenzieren der Elementtypen der SSVARIANT-Struktur vereinfachen. Beispielsweise können Sie V_SS_DATETIMEOFFSET folgendermaßen verwenden:

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

Den vollständigen Satz der Zugriffsmakros für jeden Member der SSVARIANT-Struktur finden Sie in der Datei „msoledbsql.h“.

In der folgenden Tabelle werden die Elemente der SSVARIANT-Struktur beschrieben:

Member OLE DB-Typindikator OLE DB-C-Datentyp vt-Wert Kommentare
vt SSVARTYPE Gibt den Typ des Werts in der SSVARIANT-Struktur an.
bTinyIntVal DBTYPE_UI1 BYTE VT_SS_UI1 Unterstützt den tinyintSQL Server-Datentyp.
sShortIntVal DBTYPE_I2 SHORT VT_SS_I2 Unterstützt den smallintSQL Server-Datentyp.
lIntVal DBTYPE_I4 LONG VT_SS_I4 Unterstützt den intSQL Server-Datentyp.
llBigIntVal DBTYPE_I8 LARGE_INTEGER VT_SS_I8 Unterstützt den bigintSQL Server-Datentyp.
fltRealVal DBTYPE_R4 float VT_SS_R4 Unterstützt den realSQL Server-Datentyp.
dblFloatVal DBTYPE_R8 double VT_SS_R8 Unterstützt den floatSQL Server-Datentyp.
cyMoneyVal DBTYPE_CY LARGE_INTEGER VT_SS_MONEY VT_SS_SMALLMONEY Unterstützt die Datentypen money und smallmoneySQL Server.
fBitVal DBTYPE_BOOL VARIANT_BOOL VT_SS_BIT Unterstützt den bitSQL Server-Datentyp.
rgbGuidVal DBTYPE_GUID GUID VT_SS_GUID Unterstützt den uniqueidentifierSQL Server-Datentyp.
numNumericVal DBTYPE_NUMERIC DB_NUMERIC VT_SS_NUMERIC Unterstützt den numericSQL Server-Datentyp.
dDateVal DBTYPE_DATE DBDATE VT_SS_DATE Unterstützt den date-Datentyp von SQL Server.
tsDateTimeVal DBTYPE_DBTIMESTAMP DBTIMESTAMP VT_SS_SMALLDATETIME VT_SS_DATETIME VT_SS_DATETIME2 Unterstützt die Datentypen smalldatetime, datetime und datetime2SQL Server.
Time2Val DBTYPE_DBTIME2 DBTIME2 VT_SS_TIME2 Unterstützt den timeSQL Server-Datentyp.

Beinhaltet die folgenden Member:

tTime2Val (DBTIME2)

bScale (BYTE) Gibt die Skalierung für den tTime2Val-Wert an.
tsDateTimeVal DBTYPE_DBTIMESTAMP DBTIMESTAMP VT_SS_DATETIME2 Unterstützt den datetime2SQL Server-Datentyp.

Beinhaltet die folgenden Member:

tsDataTimeVal (DBTIMESTAMP)

bScale (BYTE) Gibt die Skalierung für den tsDataTimeVal-Wert an.
DateTimeOffsetVal DBTYPE_DBTIMESTAMPOFSET DBTIMESTAMPOFFSET VT_SS_DATETIMEOFFSET Unterstützt den datetimeoffsetSQL Server-Datentyp.

Beinhaltet die folgenden Member:

tsoDateTimeOffsetVal (DBTIMESTAMPOFFSET)

bScale (BYTE) Gibt die Skalierung für den tsoDateTimeOffsetVal-Wert an.
NCharVal Kein entsprechender OLE DB-Typindikator. struct _NCharVal VT_SS_WVARSTRING,

VT_SS_WSTRING
Unterstützt die Datentypen nchar und nvarcharSQL Server.

Beinhaltet die folgenden Member:

sActualLength (SHORT) Gibt die tatsächliche Länge der Zeichenfolge an, auf die pwchNCharVal verweist. Beinhaltet nicht den abschließenden Nullwert.

sMaxLength (SHORT) Gibt die maximale Länge der Zeichenfolge an, auf die pwchNCharVal verweist.

pwchNCharVal (WCHAR *) Zeiger auf die Zeichenfolge

rgbReserved (BYTE[5] ) gibt die Sortierungsinformationen an.

Nicht verwendete Member: dwReserved und pwchReserved
CharVal Kein entsprechender OLE DB-Typindikator. struct_CharVal VT_SS_WVARSTRING

VT_SS_WVARSTRING
Unterstützt die Datentypen char und varcharSQL Server.

Beinhaltet die folgenden Member:

sActualLength (SHORT) Gibt die tatsächliche Länge der Zeichenfolge an, auf die pchCharVal verweist. Beinhaltet nicht den abschließenden Nullwert.

sMaxLength (SHORT) Gibt die maximale Länge der Zeichenfolge an, auf die pchCharVal verweist.

pchCharVal (CHAR *) Zeiger auf die Zeichenfolge

rgbReserved (BYTE[5] ) gibt die Sortierungsinformationen an.

Nicht verwendete Member:

dwReserved und pwchReserved
BinaryVal Kein entsprechender OLE DB-Typindikator. struct_BinaryVal VT_SS_VARBINARY

VT_SS_BINARY
Unterstützt die Datentypen binary und varbinarySQL Server.

Beinhaltet die folgenden Member:

sActualLength (SHORT) Gibt die tatsächliche Länge der Daten an, auf die prgbBinaryVal verweist.

sMaxLength (SHORT) Gibt die maximale Länge der Daten an, auf die prgbBinaryVal verweist.

prgbBinaryVal (BYTE *) Zeiger auf die Binärdaten

Nicht verwendeter Member: dwReserved.
UnknownType NICHT VERWENDET NICHT VERWENDET NICHT VERWENDET NICHT VERWENDET
BLOBType NICHT VERWENDET NICHT VERWENDET NICHT VERWENDET NICHT VERWENDET

Bekannte Probleme

Mögliche Datenbeschädigung bei schmalen Zeichenfolgen

Vor Version 18.4 des OLE DB-Treibers konnte das Einfügen in eine sql_variant-Spalte zu einer Beschädigung der Daten auf dem Server führen, wenn alle der folgenden Bedingungen erfüllt waren:

  • Die Codepage des Clientcomputers entsprach nicht der Codepage für die Datenbanksortierung.
  • Der einzufügende Clientpuffer enthielt der Clientcodepage entsprechend codierte Zeichen aus schmalen Nicht-ASCII-Zeichenfolgen.
  • Eine der folgenden Bedingungen traf zu:
    • Das pwszDataSourceType-Feld in der DBPARAMBINDINFO-Struktur, das den Parameter beschreibt, der der sql_variant-Spalte entspricht, wurde auf L"DBTYPE_SQLVARIANT", L"DBTYPE_VARIANT"oder L"sql_variant" festgelegt. Einzelheiten dazu finden Sie unter: ICommandWithParameters::SetParameterInfo.

      or

    • Die zum Einfügen verwendete parametrisierte SQL-Abfrage wurde vorbereitet.

Genauer gesagt übersetzte der OLE DB-Treiber die Daten vor dem Einfügen nicht gemäß der Codepage für die Datenbanksortierung. Er gab dem Server gegenüber jedoch fälschlicherweise an, dass die Daten gemäß der Codepage für die Datenbanksortierung codiert seien. Dieses Verhalten führte zu einem Konflikt zwischen den Daten und der entsprechenden, in der sql_variant-Spalte gespeicherten Codepage.

Ebenso hat der OLE DB-Treiber beim Abrufen dieses Werts Zeichenfolgen nicht der Clientcodepage entsprechend übersetzt. Da die eingefügten Daten jedoch bereits der Clientcodepage entsprechend codiert waren (siehe vorheriger Absatz), konnte die Clientanwendung die Daten richtig interpretieren. Dennoch riefen Anwendungen, die andere Treiber verwendeten, diese Werte in einem beschädigten Format ab. Die Beschädigung trat auf, da andere Treiber die Zeichenfolge gemäß der Codepage für die Datenbanksortierung interpretierten und versuchten, sie der Clientcodepage entsprechend zu übersetzen.

Ab Version 18.4 übersetzt der OLE DB-Treiber schmale Zeichenfolgen vor dem Einfügen gemäß der Codepage für die Datenbanksortierung. Ebenso übersetzt der Treiber die Daten beim Abruf gemäß der Clientcodepage wieder zurück. Daher treten bei Clientanwendungen mit dem oben erwähnten Fehler beim Abrufen von Daten, die mit einer früheren Version des OLE DB-Treibers eingefügt wurden, möglicherweise Probleme auf. Das unten dargelegte Wiederherstellungsverfahren soll Sie beim Beheben dieser Probleme unterstützen.

Wiederherstellungsverfahren

Wichtig

Stellen Sie sicher, dass Sie die vorhandenen Daten sichern, bevor Sie die folgenden Wiederherstellungsschritte ausführen.

Wenn bei Ihrer Anwendung nach dem Wechsel zu Version 18.4 des OLE DB-Treibers Probleme beim Abrufen von Daten aus einer sql_variant-Spalte auftreten, müssen die beschädigten Daten so geändert werden, dass sie dieselbe Sortierung wie die Datenbank aufweisen, in der die Daten gespeichert sind. Das folgende Skript kann verwendet werden, um einen einzelnen Wert aus einer sql_variant-Spalte wiederherzustellen. Das Skript ist eine Vorlage, die Sie an Ihr Szenario anpassen müssen.

Wichtig

Da die ursprüngliche Codepage der Daten nicht gespeichert wird, müssen Sie dem Server mitteilen, wie die Daten ursprünglich codiert wurden. Führen Sie hierzu das Skript im Kontext einer Datenbank aus, die über die gleiche Codepage wie der Client verfügt, der die Daten ursprünglich eingefügt hat. Wenn beispielsweise die beschädigten Daten von einem Client eingefügt wurden, der mit der Codepage 932 konfiguriert wurde, muss das folgende Skript im Kontext einer Datenbank mit einer japanischen Sortierung (z. B. Japanese_XJIS_100_CS_AI) ausgeführt werden.

/*
    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://learn.microsoft.com/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://learn.microsoft.com/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>

Weitere Informationen

Datentypen (OLE DB)