Große benutzerdefinierte CLR-Typen (ODBC)

In diesem Abschnitt werden Änderungen an ODBC in SQL Server Native Client erläutert, durch die große benutzerdefinierte Common Language Runtime-Typen (CLR-UDTs) unterstützt werden.

Weitere Informationen zur Unterstützung großer CLR-UDTs in SQL Native Client finden Sie unter Große benutzerdefinierte CLR-Typen.

Datenformat

SQL Server Native Client verwendet SQL_SS_LENGTH_UNLIMITED, um anzugeben, dass die Größe einer Spalte 8.000 Bytes für LOB-Typen (Large Object) überschreitet. Ab SQL Server 2008 wird derselbe Wert für CLR-UDTs mit einer Größe von über 8.000 Bytes verwendet.

UDT-Werte werden als Bytearrays dargestellt. Konvertierungen zu und von hexadezimalen Zeichenfolgen werden unterstützt. Literalwerte werden mit dem Präfix 0x als hexadezimale Zeichenfolgen dargestellt.

In der folgenden Tabelle wird die Datentypzuordnung in Parametern und Resultsets gezeigt:

SQL Server-Datentyp

SQL-Datentyp

Wert

CLR-UDT

SQL_SS_UDT

-151 (sqlncli.h)

In der folgenden Tabelle werden die entsprechenden Strukturen und ODBC C-Typen erläutert. Im Wesentlichen ist CLR-UDT ein varbinary-Typ mit zusätzlichen Metadaten.

SQL-Datentyp

Speicherlayout

C-Datentyp

Wert (sqlext.h)

SQL_SS_UDT

SQLCHAR * (Char ohne Vorzeichen *)

SQL_C_BINARY

SQL_BINARY (-2)

Deskriptorfelder für Parameter

In den IPD-Feldern werden Informationen wie folgt zurückgegeben:

Deskriptorfeld

SQL_SS_UDT

(Länge kleiner oder gleich 8.000 Bytes)

SQL_SS_UDT

(Länge größer als 8.000 Bytes)

SQL_DESC_CASE_SENSITIVE

SQL_FALSE

SQL_FALSE

SQL_DESC_CONCISE_TYPE

SQL_SS_UDT

SQL_SS_UDT

SQL_DESC_DATETIME_INTERVAL_CODE

0

0

SQL_DESC_DATETIME_INTERVAL_PRECISION

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_FIXED_PREC_SCALE

SQL_FALSE

SQL_FALSE

SQL_DESC_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_LOCAL_TYPE_NAME

"udt"

"udt"

SQL_DESC_OCTET_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_PRECISION

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_SCALE

0

0

SQL_DESC_TYPE

SQL_SS_UDT

SQL_SS_UDT

SQL_DESC_TYPE_NAME

"udt"

"udt"

SQL_DESC_UNSIGNED

SQL_TRUE

SQL_TRUE

SQL_CA_SS_UDT_CATALOG_NAME

Der Name des Katalogs, der den UDT enthält.

Der Name des Katalogs, der den UDT enthält.

SQL_CA_SS_UDT_SCHEMA_NAME

Der Name des Schemas, das den UDT enthält.

Der Name des Schemas, das den UDT enthält.

SQL_CA_SS_UDT_CATALOG_NAME

Der Name des UDT.

Der Name des UDT.

SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME

Der vollqualifizierte Name des UDT.

Der vollqualifizierte Name des UDT.

Für UDT-Parameter muss SQL_CA_SS_UDT_TYPE_NAME immer über SQLSetDescField festgelegt werden. SQL_CA_SS_UDT_CATALOG_NAME und SQL_CA_SS_UDT_SCHEMA_NAME sind optional.

Ist der UDT in derselben Datenbank mit einem anderen Schema als die Tabelle definiert, muss SQL_CA_SS_UDT_SCHEMA_NAME festgelegt werden.

Ist der UDT in einer anderen Datenbank als die Tabelle definiert, müssen SQL_CA_SS_UDT_CATALOG_NAME und SQL_CA_SS_UDT_SCHEMA_NAME festgelegt werden.

Bei Fehlern oder Auslassungen in den Einstellungen für SQL_CA_SS_UDT_TYPE_NAME, SQL_CA_SS_UDT_CATALOG_NAME oder SQL_CA_SS_UDT_SCHEMA_NAME wird ein Diagnosedatensatz mit SQLSTATE HY000 und einem serverspezifischen Meldungstext generiert.

Deskriptorfelder für Ergebnisse

In den IRD-Feldern werden Informationen wie folgt zurückgegeben:

Deskriptorfeld

SQL_SS_UDT

(Länge kleiner oder gleich 8.000 Bytes)

SQL_SS_UDT

(Länge größer als 8.000 Bytes)

SQL_DESC_AUTO_UNIQUE_VALUE

SQL_FALSE

SQL_FALSE

SQL_DESC_CASE_SENSITIVE

SQL_FALSE

SQL_FALSE

SQL_DESC_CONCISE_TYPE

SQL_SS_UDT

SQL_SS_UDT

SQL_DESC_DATETIME_INTERVAL_CODE

0

0

SQL_DESC_DATETIME_INTERVAL_PRECISION

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_DISPLAY_SIZE

2n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_FIXED_PREC_SCALE

SQL_FALSE

SQL_FALSE

SQL_DESC_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_LITERAL_PREFIX

"0x"

"0x"

SQL_DESC_LITERAL_SUFFIX

""

""

SQL_DESC_LOCAL_TYPE_NAME

"udt"

"udt"

SQL_DESC_OCTET_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_PRECISION

n

SQL_SS_LENGTH_UNLIMITED (0)

SQL_DESC_SCALE

0

0

SQL_DESC_SEARCHABLE

SQL_PRED_NONE

SQL_PRED_NONE

SQL_DESC_TYPE

SQL_SS_UDT

SQL_SS_UDT

SQL_DESC_TYPE_NAME

"udt"

"udt"

SQL_DESC_UNSIGNED

SQL_TRUE

SQL_TRUE

SQL_CA_SS_UDT_CATALOG_NAME

Der Name des Katalogs, der den UDT enthält.

Der Name des Katalogs, der den UDT enthält.

SQL_CA_SS_UDT_SCHEMA_NAME

Der Name des Schemas, das den UDT enthält.

Der Name des Schemas, das den UDT enthält.

SQL_CA_SS_UDT_TYPE_NAME

Der Name des UDT.

Der Name des UDT.

SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME

Der vollqualifizierte Name des UDT.

Der vollqualifizierte Name des UDT.

Von SQLColumns und SQLProcedureColumns zurückgegebene Spaltenmetadaten (Katalogmetadaten)

Die folgenden Spaltenwerte werden für UDTs zurückgegeben:

Spaltenname

SQL_SS_UDT

(Länge kleiner oder gleich 8.000 Bytes)

SQL_SS_UDT

(Länge größer als 8.000 Bytes)

DATA_TYPE

SQL_SS_UDT

SQL_SS_UDT

TYPE_NAME

Der Name des UDT.

Der Name des UDT.

COLUMN_SIZE

n

SQL_SS_LENGTH_UNLIMITED (0)

BUFFER_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

DECIMAL_DIGITS

NULL

NULL

SQL_DATA_TYPE

SQL_SS_UDT

SQL_SS_UDT

SQL_DATETIME_SUB

NULL

NULL

CHAR_OCTET_LENGTH

n

SQL_SS_LENGTH_UNLIMITED (0)

SS_UDT_CATALOG_NAME

Der Name des Katalogs, der den UDT enthält.

Der Name des Katalogs, der den UDT enthält.

SS_UDT_SCHEMA_NAME

Der Name des Schemas, das den UDT enthält.

Der Name des Schemas, das den UDT enthält.

SS_UDT_ASSEMBLY_TYPE_NAME

Der vollqualifizierte Name des UDT.

Der vollqualifizierte Name des UDT.

Die letzten drei Spalten sind treiberspezifische Spalten. Sie werden nach ODBC-definierten Spalten, aber vor allen gegebenenfalls vorhandenen treiberspezifischen Spalten des Resultsets von SQLColumns oder SQLProcedureColumns eingefügt.

Für einzelne UDTs oder den generischen Typ "udt" werden keine Zeilen von SQLGetTypeInfo zurückgegeben.

Bindungen und Konvertierungen

Die unterstützten Konvertierungen von SQL- zu C-Datentypen sind wie folgt:

Konvertierung von und zu:

SQL_SS_UDT

SQL_C_WCHAR

Unterstützt *

SQL_C_BINARY

Unterstützt

SQL_C_CHAR

Unterstützt *

* Binärdaten werden in eine hexadezimale Zeichenfolge konvertiert.

Die unterstützten Konvertierungen von C- zu SQL-Datentypen sind wie folgt:

Konvertierung von und zu:

SQL_SS_UDT

SQL_C_WCHAR

Unterstützt *

SQL_C_BINARY

Unterstützt

SQL_C_CHAR

Unterstützt *

* Konvertierung einer hexadezimalen Zeichenfolge in Binärdaten.

SQL_VARIANT-Unterstützung für UDTs

UDTs werden in SQL_VARIANT-Spalten nicht unterstützt.

BCP-Unterstützung für UDTs

UDT-Werte können nur als Zeichen oder Binärwerte importiert und exportiert werden.

Verhalten von Clients der unteren Ebene für UDTs

Für UDTs gilt die folgende Typzuordnung zu Clients der unteren Ebene:

Serverversion

SQL_SS_UDT

(Länge kleiner oder gleich 8.000 Bytes)

SQL_SS_UDT

(Länge größer als 8.000 Bytes)

SQL Server 2000

varbinary

image

SQL Server 2005

UDT

varbinary(max)

SQL Server 2008

UDT

UDT

ODBC-Funktionen, die große CLR-UDTs unterstützen

In diesem Abschnitt werden Änderungen an SQL Server Native Client-ODBC-Funktionen erläutert, durch die große CLR-UDTs unterstützt werden.

SQLBindCol

UDT-Ergebnisspaltenwerte werden von SQL- in C-Datentypen konvertiert, wie im Abschnitt "Bindungen und Konvertierungen" oben erläutert.

SQLBindParameter

Für UDTs sind folgende Werte erforderlich:

SQL-Datentyp

Parametertype

ColumnSizePtr

DecimalDigitsPtr

SQL_SS_UDT

(Länge kleiner oder gleich 8.000 Bytes)

SQL_SS_UDT

n

0

SQL_SS_UDT

(Länge größer als 8.000 Bytes)

SQL_SS_UDT

SQL_SS_LENGTH_UNLIMITED (0)

0

SQLColAttribute

Die für UDTs zurückgegebenen Werte sind im Abschnitt "Deskriptorfelder für Ergebnisse" oben erläutert.

SQLColumns

Die für UDTs zurückgegebenen Werte sind im Abschnitt "Von SQLColumns und SQLProcedureColumns zurückgegebene Spaltenmetadaten (Katalogmetadaten)" oben erläutert.

SQLDescribeCol

Für UDTs werden folgende Werte zurückgegeben:

SQL-Datentyp

DataTypePtr

ColumnSizePtr

DecimalDigitsPtr

SQL_SS_UDT

(Länge kleiner oder gleich 8.000 Bytes)

SQL_SS_UDT

n

0

SQL_SS_UDT

(Länge größer als 8.000 Bytes)

SQL_SS_UDT

SQL_SS_LENGTH_UNLIMITED (0)

0

SQLDescribeParam

Für UDTs werden folgende Werte zurückgegeben:

SQL-Datentyp

DataTypePtr

ColumnSizePtr

DecimalDigitsPtr

SQL_SS_UDT

(Länge kleiner oder gleich 8.000 Bytes)

SQL_SS_UDT

n

0

SQL_SS_UDT

(Länge größer als 8.000 Bytes)

SQL_SS_UDT

SQL_SS_LENGTH_UNLIMITED (0)

0

SQLFetch

UDT-Ergebnisspaltenwerte werden von SQL- in C-Datentypen konvertiert, wie im Abschnitt "Bindungen und Konvertierungen" oben erläutert.

SQLFetchScroll

UDT-Ergebnisspaltenwerte werden von SQL- in C-Datentypen konvertiert, wie im Abschnitt "Bindungen und Konvertierungen" oben erläutert.

SQLGetData

UDT-Ergebnisspaltenwerte werden von SQL- in C-Datentypen konvertiert, wie im Abschnitt "Bindungen und Konvertierungen" oben erläutert.

SQLGetDescField

Die für die neuen Datentypen verfügbaren Deskriptorfelder sind in den Abschnitten "Deskriptorfelder für Parameter" und "Deskriptorfelder für Ergebnisse" oben erläutert.

SQLGetDescRec

Für UDTs werden folgende Werte zurückgegeben:

SQL-Datentyp

Typ

Untertyp

Länge

Genauigkeit

Skalierung

SQL_SS_UDT

(Länge kleiner oder gleich 8.000 Bytes)

SQL_SS_UDT

0

n

n

0

SQL_SS_UDT

(Länge größer als 8.000 Bytes)

SQL_SS_UDT

0

SQL_SS_LENGTH_UNLIMITED (0)

SQL_SS_LENGTH_UNLIMITED (0)

0

SQLGetTypeInfo

Die für UDTs zurückgegebenen Werte sind im Abschnitt "Von SQLColumns und SQLProcedureColumns zurückgegebene Spaltenmetadaten (Katalogmetadaten)" oben erläutert.

SQLProcedureColumns

Die für UDTs zurückgegebenen Werte sind im Abschnitt "Von SQLColumns und SQLProcedureColumns zurückgegebene Spaltenmetadaten (Katalogmetadaten)" oben erläutert.

SQLPutData

UDT-Parameterwerte werden von C- in SQL-Datentypen konvertiert, wie im Abschnitt "Bindungen und Konvertierungen" oben erläutert.

SQLSetDescField

Die für die neuen Datentypen verfügbaren Deskriptorfelder sind in den Abschnitten "Deskriptorfelder für Parameter" und "Deskriptorfelder für Ergebnisse" oben erläutert.

SQLSetDescRec

Die zulässigen Werte für UDTs lauten wie folgt:

SQL-Datentyp

Typ

Untertyp

Länge

Genauigkeit

Skalierung

SQL_SS_UDT

(Länge kleiner oder gleich 8.000 Bytes)

SQL_SS_UDT

0

n

n

0

SQL_SS_UDT

(Länge größer als 8.000 Bytes)

SQL_SS_UDT

0

SQL_SS_LENGTH_UNLIMITED (0)

SQL_SS_LENGTH_UNLIMITED (0)

0

SQLSpecialColumns

Die für die Spalten DATA_TYPE, TYPE_NAME, COLUMN_SIZE, BUFFER_LENGTH und DECIMAL_DIGTS zurückgegebenen UDT-Werte sind im Abschnitt "Von SQLColumns und SQLProcedureColumns zurückgegebene Spaltenmetadaten (Katalogmetadaten)" oben erläutert.