Använda User-Defined-typerna

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-databas i Microsoft Fabric

Ladda ned OLE DB-drivrutins

SQL Server 2005 (9.x) introducerade användardefinierade typer (UDT). UDT:er utökar SQL-typsystemet genom att låta dig lagra objekt och anpassade datastrukturer i en SQL Server-databas. UDT kan innehålla flera datatyper och kan ha beteenden, vilket skiljer dem från de traditionella aliasdatatyperna som består av en enda SQL Server-systemdatatyp. UDT:er definieras med något av de språk som stöds av .NET common language runtime (CLR) och som producerar verifierbar kod. Detta inkluderar C# och Visual Basic .NET. Datan exponeras som fält och egenskaper hos en .NET-klass eller struktur, och beteenden definieras av metoder i klassen eller strukturen.

En UDT kan användas som kolumndefinition av en tabell, som variabel i en Transact-SQL batch, eller som ett argument i en Transact-SQL funktion eller lagrad procedur.

OLE DB-drivrutin för SQL Server

OLE DB-drivrutinen för SQL Server stöder UDT:er som binära typer med metadata, vilket gör att du kan hantera UDT:er som objekt. UDT-kolumner exponeras som DBTYPE_UDT, och deras metadata exponeras via kärngränssnittet IColumnRowset och det nya gränssnittet ISSCommandWithParameters .

Anmärkning

IRowsetFind::FindNextRow-metoden fungerar inte med UDT-datatypen. DB_E_BADCOMPAREOP returneras om UDT används som sökkolumntyp.

Databindningar och tvång

Följande tabell beskriver bindningen och tvingandet som uppstår när man använder de listade datatyperna med en SQL Server UDT. UDT-kolumner exponeras via OLE DB-drivrutinen för SQL Server som DBTYPE_UDT. Du kan få metadata genom lämpliga schema-raduppsättningar så att du kan hantera dina egna definierade typer som objekt.

Datatyp Till servern

UDT
Till servern

icke-UDT
Från servern

UDT
Från servern

icke-UDT
DBTYPE_UDT Stödde6 Fel1 Stödde6 Fel5
DBTYPE_BYTES Stödde6 Ej tillämpligt2 Stödde6 Ej tillämpligt2
DBTYPE_WSTR Stödd3,6 Ej tillämpligt2 Stödd4,6 Ej tillämpligt2
DBTYPE_BSTR Stödd3,6 Ej tillämpligt2 Stödd4 Ej tillämpligt2
DBTYPE_STR Stödd3,6 Ej tillämpligt2 Stödd4,6 Ej tillämpligt2
DBTYPE_IUNKNOWN Stöds inte Ej tillämpligt2 Stöds inte Ej tillämpligt2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Stödde6 Ej tillämpligt2 Stödd4 Ej tillämpligt2
DBTYPE_VARIANT (VT_BSTR) Stödd3,6 Ej tillämpligt2 N/A Ej tillämpligt2

1Om en servertyp annan än DBTYPE_UDT anges med ICommandWithParameters::SetParameterInfo och accessortypen är DBTYPE_UDT, uppstår ett fel när satsen exekveras (DB_E_ERRORSOCCURRED; parameterstatusen är DBSTATUS_E_BADACCESSOR). Annars skickas datan till servern, men servern ger ett felmeddelande som indikerar att det inte sker någon implicit konvertering från UDT till parameterns datatyp.

2Utöver ramen för denna artikel.

3 Datakonvertering från hexsträng till binär data sker.

4 Datakonvertering från binär data till hexsträng sker.

5Validering kan ske vid skapande accessor, eller vid hämtningstid, felet är DB_E_ERRORSOCCURRED, bindningsstatus satt till DBBINDSTATUS_UNSUPPORTEDCONVERSION.

6BY_REF kan användas.

DBTYPE_NULL och DBTYPE_EMPTY kan bindas för indataparametrar men inte för utgångsparametrar eller resultat. När den är begränsad för indataparametrar måste statusen sättas till DBSTATUS_S_ISNULL eller DBSTATUS_S_DEFAULT.

DBTYPE_UDT kan också konverteras till DBTYPE_EMPTY och DBTYPE_NULL, men DBTYPE_NULL och DBTYPE_EMPTY kan inte konverteras till DBTYPE_UDT. Detta stämmer överens med DBTYPE_BYTES.

Anmärkning

Ett nytt gränssnitt används för att hantera UDT:er som parametrar, ISSCommandWithParameters, som ärver från ICommandWithParameters. Applikationer måste använda detta gränssnitt för att sätta minst SSPROP_PARAM_UDT_NAME av DBPROPSET_SQLSERVERPARAMETER egenskapsuppsättningen för UDT-parametrar. Om detta inte görs kommer ICommand::Execute att returnera DB_E_ERRORSOCCURRED. Detta gränssnitt och egenskapsuppsättning beskrivs senare i denna artikel.

Om en användardefinierad typ infogas i en kolumn som inte är tillräckligt stor för att rymma all dess data, kommer ICommand::Execute att returnera S_OK med statusen DB_E_ERRORSOCCURRED.

Datakonverteringar som tillhandahålls av OLE DB-kärntjänster (IDataConvert) är inte tillämpliga på DBTYPE_UDT. Inga andra bindningar stöds.

OLE DB raduppsättningstillägg och ändringar

OLE DB Driver för SQL Server lägger till nya värden eller ändringar i många av de centrala raderna i OLE DB-schemat.

Den PROCEDURE_PARAMETERS schema-raduppsättningen

Följande tillägg har gjorts till PROCEDURE_PARAMETERS schema-raduppsättningen.

Kolumnnamn Typ Description
SS_UDT_CATALOGNAME DBTYPE_WSTR Den tredelade namnidentifieraren.
SS_UDT_SCHEMANAME DBTYPE_WSTR Den tredelade namnidentifieraren.
SS_UDT_NAME DBTYPE_WSTR Den tredelade namnidentifieraren.
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Assembly Qualified Name, som inkluderar typnamnet och all församlingsidentifiering som krävs för att refereras av CLR.

Den SQL_ASSEMBLIES schema-raduppsättningen

OLE DB-drivrutinen för SQL Server exponerar en ny leverantörsspecifik schema-raduppsättning som beskriver de registrerade UDT:erna. ASSEMBLY-servern kan specificeras som en DBTYPE_WSTR, men finns inte i raduppsättningen. Om det inte specificeras kommer raduppsättningen att gå till den aktuella servern som standard. Den SQL_ASSEMBLIES schema-raduppsättningen definieras i följande tabell:

Kolumnnamn Typ Description
ASSEMBLY_CATALOG DBTYPE_WSTR Katalognamnet på den samling som innehåller typen.
ASSEMBLY_SCHEMA DBTYPE_WSTR Schemanamnet, eller ägarnamnet, för den sammansättning som innehåller typen. Även om assemblies är begränsade av databas och inte schema, har de ändå en ägare som återspeglas här.
ASSEMBLY_NAME DBTYPE_WSTR Namnet på den samling som innehåller typen.
ASSEMBLY_ID DBTYPE_UI4 Objekt-ID:t för den assembly som innehåller typen.
PERMISSION_SET DBTYPE_WSTR Ett värde som anger omfattningen av åtkomst för monteringen. Värden inkluderar "SÄKER", "EXTERNAL_ACCESS" och "OSÄKER".
ASSEMBLY_BINARY DBTYPE_BYTES Den binära representationen av sammansättningen.

Schema-raduppsättningen SQL_ASSEMBLIES_ DEPENDENCIES

OLE DB Driver för SQL Server exponerar en ny leverantörsspecifik schema-raduppsättning som beskriver assembly-beroendena för en specificerad server. ASSEMBLY_SERVER kan anges av anroparen som en DBTYPE_WSTR, men finns inte i raduppsättningen. Om det inte specificeras kommer raduppsättningen att gå till den aktuella servern som standard. Raden SQL_ASSEMBLY_DEPENDENCIES schema definieras i följande tabell:

Kolumnnamn Typ Description
ASSEMBLY_CATALOG DBTYPE_WSTR Katalognamnet på den samling som innehåller typen.
ASSEMBLY_SCHEMA DBTYPE_WSTR Schemanamnet, eller ägarnamnet, för den sammansättning som innehåller typen. Även om assemblies är begränsade av databas och inte schema, har de ändå en ägare, vilket återspeglas här.
ASSEMBLY_ID DBTYPE_UI4 Objekt-ID:t för monteringen.
REFERENCED_ASSEMBLY_ID DBTYPE_UI4 Objekt-ID:t för den refererade samlingen.

Den SQL_USER_TYPES schema-raduppsättningen

OLE DB Driver för SQL Server exponerar en ny schema-raduppsättning, SQL_USER_TYPES, som beskriver när registrerade UDT:er för en specificerad server läggs till. UDT_SERVER måste anges som en DBTYPE_WSTR av anroparen men finns inte i raduppsättningen. Den SQL_USER_TYPES schema-raduppsättningen definieras i följande tabell.

Kolumnnamn Typ Description
UDT_CATALOGNAME DBTYPE_WSTR För UDT-kolumner är denna egenskap en sträng som specificerar namnet på katalogen där UDT är definierad.
UDT_SCHEMANAME DBTYPE_WSTR För UDT-kolumner är denna egenskap en sträng som specificerar namnet på schemat där UDT är definierad.
UDT_NAME DBTYPE_WSTR Namnet på församlingen som innehåller UDT-klassen.
UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Full typnamn (AQN) inkluderar typnamn med föremålet namnrymd om tillämpligt.

COLUMNS schema-radset

Tillägg till COLUMNS-schemats raduppsättning inkluderar följande kolumner:

Kolumnnamn Typ Description
SS_UDT_CATALOGNAME DBTYPE_WSTR För UDT-kolumner är denna egenskap en sträng som specificerar namnet på katalogen där UDT är definierad.
SS_UDT_SCHEMANAME DBTYPE_WSTR För UDT-kolumner är denna egenskap en sträng som specificerar namnet på schemat där UDT är definierad.
SS_UDT_NAME DBTYPE_WSTR Namnet på UDT
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Full typnamn (AQN) inkluderar typnamn med föremålet namnrymd om tillämpligt.

OLE DB egenskapsuppsättningstillägg och ändringar

OLE DB Driver för SQL Server lägger till nya värden eller ändringar i många av de grundläggande egenskapsuppsättningarna i OLE DB.

Den DBPROPSET_SQLSERVERPARAMETER egenskapsmängden

För att stödja UDT:er via OLE DB implementerar ole db Driver för SQL Server den nya DBPROPSET_SQLSERVERPARAMETER egenskapsuppsättningen, som innehåller följande värden:

Namn Typ Description
SSPROP_PARAM_UDT_CATALOGNAME DBTYPE_WSTR Den tredelade namnidentifieraren.

För UDT-parametrar är denna egenskap en sträng som specificerar namnet på katalogen där den användardefinierade typen definieras.
SSPROP_PARAM_UDT_SCHEMANAME DBTYPE_WSTR Den tredelade namnidentifieraren.

För UDT-parametrar är denna egenskap en sträng som specificerar namnet på schemat där den användardefinierade typen definieras.
SSPROP_PARAM_UDT_NAME DBTYPE_WSTR Den tredelade namnidentifieraren.

För UDT-kolumner är denna egenskap en sträng som specificerar det enskilda delnamnet för den användardefinierade typen.

SSPROP_PARAM_UDT_NAME är obligatoriskt. SSPROP_PARAM_UDT_CATALOGNAME och SSPROP_PARAM_UDT_SCHEMANAME är frivilliga. Om någon av fastigheterna är felaktigt specificerad kommer DB_E_ERRORSINCOMMAND att returneras. Om både SSPROP_PARAM_UDT_CATALOGNAME och SSPROP_PARAM_UDT_SCHEMANAME inte specificeras måste UDT definieras i samma databas och schema som tabellen. Om UDT-definitionen inte finns i samma schema som tabellen (men finns i samma databas), måste SSPROP_PARAM_UDT_SCHEMANAME specificeras. Om UDT-definitionen finns i en annan databas måste både SSPROP_PARAM_UDT_CATALOGNAME och SSPROP_PARAM_UDT_SCHEMANAME specificeras.

Den DBPROPSET_SQLSERVERCOLUMN egenskapsmängden

För att stödja skapandet av tabeller i ITableDefinition-gränssnittet lägger OLE DB Driver för SQL Server till följande tre nya kolumner till DBPROPSET_SQLSERVERCOLUMN egenskapsuppsättningen.

Namn Description Typ Description
SSPROP_COL_UDT_CATALOGNAME UDT_CATALOGNAME VT_BSTR För kolumner av typ DBTYPE_UDT är denna egenskap en sträng som specificerar namnet på katalogen där UDT är definierad.
SSPROP_COL_UDT_SCHEMANAME UDT_SCHEMANAME VT_BSTR För kolumner av typ DBTYPE_UDT är denna egenskap en sträng som anger namnet på schemat där UDT är definierad.
SSPROP_COL_UDT_NAME UDT_NAME VT_BSTR För kolumner av typ DBTYPE_UDT är denna egenskap en sträng som anger namnet på en enda del för UDT. För andra kolumntyper returnerar denna egenskap en tom sträng.

Anmärkning

UDT:er förekommer inte i PROVIDER_TYPES schema-raduppsättningen. Alla kolumner har läs- och skrivbehörighet.

ADO refererar till dessa egenskaper genom att använda motsvarande post i kolumnen Beskrivning.

SSPROP_COL_UDTNAME är obligatoriskt. SSPROP_COL_UDT_CATALOGNAME och SSPROP_COL_UDT_SCHEMANAME är frivilliga. Om någon av fastigheterna är felaktigt specificerad kommer DB_E_ERRORSINCOMMAND att returneras.

Om varken SSPROP_COL_UDT_CATALOGNAME eller SSPROP_COL_UDT_SCHEMANAME anges måste UDT definieras i samma databas och schema som tabellen.

Om UDT-definitionen inte finns i samma schema som tabellen (men finns i samma databas) måste SSPROP_COL_UDT_SCHEMANAME specificeras.

Om UDT-definitionen finns i en annan databas måste både SSPROP_COL_UDT_CATALOGNAME och SSPROP_COL_UDT_SCHEMANAME specificeras.

OLE DB-gränssnittets tillägg och förändringar

OLE DB Driver för SQL Server lägger till nya värden eller ändringar i många av de centrala OLE DB-gränssnitten.

ISSCommandWithParameters-gränssnittet

För att stödja UDT:er via OLE DB implementerar ole db Driver för SQL Server ett antal förändringar, inklusive tillägget av ISSCommandWithParameters-gränssnittet . Detta nya gränssnitt ärver från kärngränssnittet i OLE DB ICommandWithParameters. Utöver de tre metoder som ärvts från ICommandWithParameters; GetParameterInfo, MapParameterNames och SetParameterInfo; ISSCommandWithParameters tillhandahåller metoderna GetParameterProperties och SetParameterProperties som används för att hantera serverspecifika datatyper.

Anmärkning

ISSCommandWithParameters-gränssnittet använder också den nya SSPARAMPROPS-strukturen.

IColumnsRowset-gränssnittet

Utöver ISSCommandWithParameters-gränssnittet lägger OLE DB Driver för SQL Server även till nya värden till radmängden som returneras från att anropa IColumnsRowset::GetColumnRowset-metoden , inklusive följande.

Kolumnnamn Typ Description
DBCOLUMN_SS_UDT_CATALOGNAME DBTYPE_WSTR En UDT-katalognamnsidentifierare.
DBCOLUMN_SS_UDT_SCHEMANAME DBTYPE_WSTR En identifierare för UDT-schemanamn.
DBCOLUMN_SS_UDT_NAME DBTYPE_WSTR Ett UDT-namnidentifierare.
DBCOLUMN_SS_ASSEMBLY_TYPENAME DBTYPE_WSTR Namnet på församlingen kvalificerar sig, vilket inkluderar typnamnet och all samlingsidentifiering som krävs för att refereras av CLR.

Du kan särskilja en server-UDT-kolumn från andra binära typer när DBCOLUMN_TYPE är inställd på DBTYPE_UDT genom att titta på den tillagda UDT-metadata som anges i föregående tabell. Om den datan är delvis komplett är servertypen en UDT. För servertyper som inte är UDT returneras dessa kolumner alltid som NULL.

Se även

OLE DB-drivrutin för SQL Server-funktioner
ISSCommandWithParameters (OLE DB)