Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-databas i Microsoft Fabric
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)