Megosztás a következőn keresztül:


User-Defined típusok használata SQL Server natív kliensben

Vonatkozik a következőkre:SQL ServerAzure SQL DatabaseAnalitikai Platform System (PDW)

Fontos

SQL Server Native Client (SNAC) nem kerül szállításra a következőkkel:

  • SQL Server 2022 (16.x) és újabb verziók
  • AZ SQL Server Management Studio 19- és újabb verziói

Az SQL Server natív ügyfele (SQLNCLI vagy SQLNCLI11) és az örökölt Microsoft OLE DB Provider for SQL Server (SQLOLEDB) nem ajánlott az új alkalmazásfejlesztéshez.

Új projektek esetén használja az alábbi illesztőprogramok egyikét:

Az SQL Server adatbázismotor (2012–2019) egyik összetevőjeként szállított SQLNCLI esetében tekintse meg az alábbi támogatási életciklus-kivételt.

Az SQL Server 2005 (9.x) bevezette a felhasználó által definiált típusokat (UDT-k). Az UDT-k kibővítik az SQL típus rendszert azzal, hogy lehetővé teszik objektumok és egyedi adatstruktúrák tárolását egy SQL Server adatbázisban. Az UDT-k több adattípust tartalmazhatnak, és viselkedésük is lehet, megkülönböztetve őket a hagyományos alias adattípusoktól, amelyek egyetlen SQL Server-rendszer adattípusából állnak. Az UDT-ket bármely olyan nyelven definiálják, amelyet a .NET common language runtime (CLR) támogat, és amely ellenőrizhető kódot eredményez. Ez magában foglalja a C# és a Visual Basic .NET programokat. Az adatok egy .NET osztály vagy struktúra mezőiként és tulajdonságaiként jelennek meg, és a viselkedéseket az osztály vagy struktúra módszerei határozzák meg.

Az UDT használható tábla oszlopdefiníciójaként, egy Transact-SQL adag változójaként, vagy egy Transact-SQL függvény vagy tárolt eljárás argumentumaként.

SQL Server natív ügyféloldali OLE DB-szolgáltató

Az SQL Server Native Client OLE DB szolgáltató bináris típusként támogatja az UDT-ket metaadat-információval, ami lehetővé teszi, hogy az UDT-ket objektumként kezeld. Az UDT oszlopok DBTYPE_UDT-ként jelennek meg, és metaadataik az IColumnRowset mag OLE DB interfészen és az új ISSCommandWithParameters interfészen keresztül jelennek meg.

Megjegyzés:

Az IRowsetFind::FindNextRow módszer nem működik az UDT adattípussal. DB_E_BADCOMPAREOP akkor jelenik meg, ha az UDT-t keresőoszlop-típusként használják.

Adatkötések és kényszerítések

Az alábbi táblázat leírja a kötést és kényszerítést, amely akkor jelentkezik, amikor a felsorolt adattípusokat SQL Server UDT-vel használjuk. Az UDT oszlopokat az SQL Server Native Client OLE DB szolgáltatója DBTYPE_UDT formátumban mutatja be. A megfelelő séma sorhalmazokon keresztül szerezheted a metaadatokat, így a saját definiált típusokat objektumként kezelheted.

Adattípus Szerverre

UDT
Szerverre

nem-UDT
A szerverről

UDT
A szerverről

nem-UDT
DBTYPE_UDT Támogatott 6 1. hiba Támogatott 6 5-es hiba
DBTYPE_BYTES Támogatott 6 Nem elérhető2 Támogatott 6 Nem elérhető2
DBTYPE_WSTR Támogatott 3,6 Nem elérhető2 Támogatott 4,6 Nem elérhető2
DBTYPE_BSTR Támogatott 3,6 Nem elérhető2 Támogatott 4 Nem elérhető2
DBTYPE_STR Támogatott 3,6 Nem elérhető2 Támogatott 4,6 Nem elérhető2
DBTYPE_IUNKNOWN Nem támogatott Nem elérhető2 Nem támogatott Nem elérhető2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Támogatott 6 Nem elérhető2 Támogatott 4 Nem elérhető2
DBTYPE_VARIANT (VT_BSTR) Támogatott 3,6 Nem elérhető2 N/A Nem elérhető2

1Ha ICommandWithParameters::SetParameterInfo egy szervertípust az ICommandWithParameters::SetParameterInfo jelöl meg DBTYPE_UDT-től, és a kiegészítőtípus DBTYPE_UDT, hiba következik a mondatparancs végrehajtása esetén (DB_E_ERRORSOCCURRED; a paraméter állapota DBSTATUS_E_BADACCESSOR). Ellenkező esetben az adatokat elküldik a szervernek, de a szerver hibát ad, amely jelzi, hogy nincs implicit átalakítás az UDT-ből a paraméter adattípusára.

2Ezen a témán túl.

3 Adatátalakítás hex láncszálból bináris adatra történik.

4 A bináris adatból hex láncra történő adatátalakítás történik.

5A hitelesítés előfordulhat hozzáférés létrehozási időnél, vagy a behíváskor a hiba DB_E_ERRORSOCCURRED, kötési státusz DBBINDSTATUS_UNSUPPORTEDCONVERSION-re állítva.

6BY_REF használhatók.

DBTYPE_NULL és DBTYPE_EMPTY bemeneti paraméterekre köthetők, de kimeneti paraméterekre vagy eredményekre nem. Bemeneti paraméterekre korlátozva az állapotot DBSTATUS_S_ISNULL vagy DBSTATUS_S_DEFAULT be kell állítani.

DBTYPE_UDT átalakíthatók DBTYPE_EMPTY-re és DBTYPE_NULL-re is, de a DBTYPE_NULL és DBTYPE_EMPTY nem konvertálhatók DBTYPE_UDT-re. Ez összhangban van DBTYPE_BYTES-vel.

Megjegyzés:

Egy új interfészt használnak az UDT-k paraméterként való kezelésére, az ISSCommandWithParameters-t, amely az ICommandWithParameters-tól örököl. Az alkalmazásoknak ezt az interfészt kell használniuk ahhoz, hogy legalább az DBPROPSET_SQLSERVERPARAMETER tulajdonsághalmazának SSPROP_PARAM_UDT_NAME-jét beállítsák az UDT paraméterekhez. Ha ezt nem csinálják, az ICommand::Execute DB_E_ERRORSOCCURRED visszaad. Ezt az interfészt és tulajdonsághalmazt később ebben a témában ismertetjük.

Ha egy felhasználó által definiált típust beillesztünk egy olyan oszlopba, amely nem elég nagy ahhoz, hogy minden adatát tárolja, az ICommand::Execute DB_E_ERRORSOCCURRED státuszú S_OK-ot ad vissza.

Az OLE DB magszolgáltatások (IDataConvert) által biztosított adatátalakítások nem alkalmazhatók DBTYPE_UDT-re. Más kötések nem támogatottak.

OLE DB sorkészlet bővítések és változtatások

Az SQL Server Native Client új értékeket vagy változtatásokat ad hozzá sok alapvető OLE DB séma sorhalmazhoz.

A PROCEDURE_PARAMETERS séma sorkészlet

Az alábbi kiegészítéseket a PROCEDURE_PARAMETERS séma sorkészletéhez tettük.

Oszlop név Típus Description
SS_UDT_CATALOGNAME DBTYPE_WSTR A háromrészes névazonosító.
SS_UDT_SCHEMANAME DBTYPE_WSTR A háromrészes névazonosító.
SS_UDT_NAME DBTYPE_WSTR A háromrészes névazonosító.
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR A Assembly minősített név, amely tartalmazza a típusnevet és az összes assembly azonosítót, amelyre a CLR hivatkozik.

A SQL_ASSEMBLIES séma sorkészlet

Az SQL Server Native Client OLE DB szolgáltató egy új szolgáltató-specifikus séma sorkészletet mutat be, amely leírja a regisztrált UDT-ket. A ASSEMBLY szerver DBTYPE_WSTR-ként is meghatározható, de nincs jelen a sorhalmazban. Ha nincs megadva, a sorhalmaz alapértelmezett jelenlegi szerverre fog váltani. A SQL_ASSEMBLIES séma sorhalmazát a következő táblázat definiálja.

Oszlop név Típus Description
ASSEMBLY_CATALOG DBTYPE_WSTR Az összeállítás katalógusneve, amely tartalmazza a típust.
ASSEMBLY_SCHEMA DBTYPE_WSTR A típust tartalmazó assembly séma neve, vagyis tulajdonos neve. Bár az összeállításokat adatbázis szerint szabályozzák, nem séma alapján, mégis van tulajdonosuk, ami itt is tükröződik.
ASSEMBLY_NAME DBTYPE_WSTR Az összeállítás neve, amely tartalmazza a típust.
ASSEMBLY_ID DBTYPE_UI4 Az objektumazonosító az összeállításban, amely tartalmazza a típust.
PERMISSION_SET DBTYPE_WSTR Egy érték, amely a assembly hozzáférési körét jelzi. Az értékek közé tartozik a "SAFE", "EXTERNAL_ACCESS" és "UNSAFE".
ASSEMBLY_BINARY DBTYPE_BYTES A gyűlés bináris ábrázolása.

A SQL_ASSEMBLIES_ DEPENDENCIES séma sorhalmaza

Az SQL Server Native Client OLE DB szolgáltató egy új, szolgáltató-specifikus sémasorkészletet tesz közzé, amely leírja egy adott szerver assembly függőségeit. ASSEMBLY_SERVER a hívó által megjelölhető DBTYPE_WSTR, de nincs jelen a sorhalmazban. Ha nincs megadva, a sorhalmaz alapértelmezett jelenlegi szerverre fog váltani. Az SQL_ASSEMBLY_DEPENDENCIES séma sorhalmazát a következő táblázat definiálja.

Oszlop név Típus Description
ASSEMBLY_CATALOG DBTYPE_WSTR Az összeállítás katalógusneve, amely tartalmazza a típust.
ASSEMBLY_SCHEMA DBTYPE_WSTR A típust tartalmazó assembly séma neve, vagyis tulajdonos neve. Bár az összeállításokat adatbázis szerint szabályozzák, nem séma alapján, mégis van tulajdonosuk, ami itt is tükröződik.
ASSEMBLY_ID DBTYPE_UI4 Az összeszerelés tárgyazonosítója.
REFERENCED_ASSEMBLY_ID DBTYPE_UI4 A hivatkozott assembly objektumazonosítója.

A SQL_USER_TYPES séma sorkészlete

SQL Server Native Client OLE DB szolgáltató új séma sorkészletet, SQL_USER_TYPES-t mutat be, amely leírja, mikor adják hozzá egy adott szerver regisztrált UDT-it. UDT_SERVER a hívónak meg kell határoznia DBTYPE_WSTR, de nincs jelen a sorhalmazban. A SQL_USER_TYPES séma sorhalmazát az alábbi táblázat definiálja.

Oszlop név Típus Description
UDT_CATALOGNAME DBTYPE_WSTR UDT oszlopok esetén ez a tulajdonság egy string, amely megadja annak a katalógusnak a nevét, ahol az UDT meg van definiálva.
UDT_SCHEMANAME DBTYPE_WSTR UDT oszlopok esetén ez a tulajdonság egy string, amely megadja annak a sémának a nevét, ahol az UDT definiálva van.
UDT_NAME DBTYPE_WSTR Az UDT osztályt tartalmazó assembly neve.
UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR A teljes típusnév (AQN) tartalmazza a névteret előtagokkal, ha alkalmazható.

A COLUMNS séma sorkészlete

A COLUMNS séma sorhalmazához kiegészítések a következőket tartalmazzák.

Oszlop név Típus Description
SS_UDT_CATALOGNAME DBTYPE_WSTR UDT oszlopok esetén ez a tulajdonság egy string, amely megadja annak a katalógusnak a nevét, ahol az UDT meg van definiálva.
SS_UDT_SCHEMANAME DBTYPE_WSTR UDT oszlopok esetén ez a tulajdonság egy string, amely megadja annak a sémának a nevét, ahol az UDT definiálva van.
SS_UDT_NAME DBTYPE_WSTR Az UDT neve
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR A teljes típusnév (AQN) tartalmazza a névteret előtagokkal, ha alkalmazható.

OLE DB Property Set kiegészítések és változtatások

Az SQL Server Native Client új értékeket vagy változtatásokat ad hozzá sok OLE DB alapvető tulajdonsághalmazhoz.

A DBPROPSET_SQLSERVERPARAMETER tulajdonsághalmaz

Az UDT-k támogatásához az OLE DB-n keresztül a SQL Server Native Client megvalósítja az új DBPROPSET_SQLSERVERPARAMETER tulajdonsághalmazt, amely tartalmazza a következő értékeket.

Név Típus Description
SSPROP_PARAM_UDT_CATALOGNAME DBTYPE_WSTR A háromrészes névazonosító.

Az UDT paraméterek esetén ez a tulajdonság egy string, amely megadja annak a katalógusnak a nevét, ahol a felhasználó által definiált típus van meghatározva.
SSPROP_PARAM_UDT_SCHEMANAME DBTYPE_WSTR A háromrészes névazonosító.

UDT paramétereknél ez a tulajdonság egy string, amely megadja annak a sémának a nevét, ahol a felhasználó által definiált típus van meghatározva.
SSPROP_PARAM_UDT_NAME DBTYPE_WSTR A háromrészes névazonosító.

UDT oszlopok esetén ez a tulajdonság egy string, amely megadja a felhasználó által definiált típus egyetlen résznevét.

SSPROP_PARAM_UDT_NAME kötelező. SSPROP_PARAM_UDT_CATALOGNAME és SSPROP_PARAM_UDT_SCHEMANAME opcionálisak. Ha bármelyik tulajdonság hibásan van megadva DB_E_ERRORSINCOMMAND vissza fogják térni. Ha mind a SSPROP_PARAM_UDT_CATALOGNAME, mind a SSPROP_PARAM_UDT_SCHEMANAME nincs megadva, akkor az UDT-t ugyanabban az adatbázisban és sémában kell definiálni, mint a táblát. Ha az UDT definíció nem ugyanabban a sémában van, mint a tábla (de ugyanabban az adatbázisban van), akkor SSPROP_PARAM_UDT_SCHEMANAME meg kell határozni. Ha az UDT definíciója egy másik adatbázisban van, akkor mind a SSPROP_PARAM_UDT_CATALOGNAME-t, mind a SSPROP_PARAM_UDT_SCHEMANAME-t meg kell határozni.

A DBPROPSET_SQLSERVERCOLUMN tulajdonsághalmaz

Az ITableDefinition felületben lévő táblák létrehozásának támogatásához az SQL Server Native Client a következő három új oszlopot ad hozzá a DBPROPSET_SQLSERVERCOLUMN tulajdonsághalmazhoz.

Név Description Típus Description
SSPROP_COL_UDT_CATALOGNAME UDT_CATALOGNAME VT_BSTR DBTYPE_UDT típusú oszlopok esetén ez a tulajdonság egy láncsor, amely megadja annak a katalógusnak a nevét, ahol az UDT meg van definiálva.
SSPROP_COL_UDT_SCHEMANAME UDT_SCHEMANAME VT_BSTR DBTYPE_UDT típusú oszlopok esetén ez a tulajdonság egy string, amely megadja annak a sémának a nevét, ahol az UDT definiálva van.
SSPROP_COL_UDT_NAME UDT_NAME VT_BSTR Az DBTYPE_UDT típusú oszlopok esetében ez a tulajdonság egy láncsor, amely megadja az UDT egyetlen résznevét. Más oszloptípusoknál ez a tulajdonság üres stringet ad vissza.

Megjegyzés:

Az UDT-k nem jelennek meg a PROVIDER_TYPES séma sorhalmazában. Minden oszlopnak van olvasási és írási hozzáférése.

Az ADO ezekre a tulajdonságokra a Leírás oszlopban található megfelelő bejegyzés segítségével hivatkozik.

SSPROP_COL_UDTNAME kötelező. SSPROP_COL_UDT_CATALOGNAME és SSPROP_COL_UDT_SCHEMANAME opcionálisak. Ha bármelyik tulajdonságot hibásan jelölik meg, DB_E_ERRORSINCOMMAND visszakerül.

Ha sem SSPROP_COL_UDT_CATALOGNAME, sem SSPROP_COL_UDT_SCHEMANAME nincs megadva, az UDT-t ugyanabban az adatbázisban és sémában kell definiálni, mint a táblázat.

Ha az UDT definíciója nem ugyanabban a sémában van, mint a tábla (de ugyanabban az adatbázisban van), SSPROP_COL_UDT_SCHEMANAME meg kell határozni.

Ha az UDT definíciója egy másik adatbázisban van, mind a SSPROP_COL_UDT_CATALOGNAME-t, mind a SSPROP_COL_UDT_SCHEMANAME-t meg kell határozni.

OLE DB interfész kibővítések és változtatások

Az SQL Server Native Client új értékeket vagy módosításokat ad hozzá sok alapvető OLE DB interfészhez.

Az ISSCommandWithParameters interfész

Az UDT-k támogatásához az OLE DB-n keresztül a SQL Server Native Client számos változtatást valósít meg, beleértve az ISSCommandWithParameters interfész hozzáadását. Ez az új interfész az ICommandWithParameters mag OLE DB interfészből örököl. Az ICommandWithParameters-től örökölt három módszer mellett; GetParameterInfo, MapParameterNames és SetParameterInfo; Az ISSCommandWithParameters biztosítja a GetParameterProperties és SetParameterProperties metódusokat, amelyeket szerverspecifikus adattípusok kezelésére használnak.

Megjegyzés:

Az ISSCommandWithParameters interfész szintén az új SSPARAMPROPS struktúrát használja.

Az IColumnsRowset interfész

Az ISSCommandWithParameters interfészen túl az SQL Server Native Client új értékeket is hozzáad a sorhalmazhoz, amely az IColumnsRowset::GetColumnRowset metódus meghívásából származik, beleértve a következőket.

Az oszlop neve Típus Description
DBCOLUMN_SS_UDT_CATALOGNAME DBTYPE_WSTR Egy UDT katalógusnévazonosító.
DBCOLUMN_SS_UDT_SCHEMANAME DBTYPE_WSTR Egy UDT séma névazonosító.
DBCOLUMN_SS_UDT_NAME DBTYPE_WSTR Egy UDT névazonosító.
DBCOLUMN_SS_ASSEMBLY_TYPENAME DBTYPE_WSTR Az assembly minősített név, amely tartalmazza a típusnevet és az összes assembly azonosítót, amely szükséges a CLR számára.

Meg lehet különböztetni egy szerver UDT oszlopot más bináris típusoktól, ha a DBCOLUMN_TYPE DBTYPE_UDT-re van állítva, ha megnézed a fent említett hozzáadott UDT metaadatokat. Ha az adatok részben teljesek, akkor a szerver típusa UDT. Nem UDT szervertípusok esetén ezek az oszlopok mindig NULL értékben jelennek meg.

SQL Server natív kliens ODBC driver

Számos változtatást hajtottak végre az SQL Server Native Client ODBC illezőprogramban, hogy támogassa az UDT-ket. Az SQL Server Native Client ODBC illesztőprogram az SQL Server UDT-t SQL_SS_UDT illesztőgép-specifikus SQL adattípus-azonosítóhoz képezi. Az UDT oszlopok SQL_SS_UDT felületűek. Ha egy UDT oszlopot kifejezetten egy másik típushoz jelölünk egy SQL utasításban az UDT ToString vagy ToXMLString módszereivel, vagy a CAST/CONVERT függvény segítségével, akkor az eredményhalmazban lévő oszlop típusa tükrözi azt a típust, amelyre az oszlopot átalakították

SQLColAttribute, SQLDescribeParam, SQLGetDescField

Négy új, driver-specifikus leíró mezőt adtak hozzá, hogy további információkat nyújtsanak az eredményhalmaz UDT oszlopához, vagy tárolt eljárás/paraméterezett lekérdezés UDT paraméteréhez, amelyeket az SQLColAttribute, SQLDescribeParam és SQLGetDescField függvények segítségével lehet letölteni.

A négy új leíró mező a SQL_CA_SS_UDT_CATALOG_NAME, SQL_CA_SS_UDT_SCHEMA_NAME, SQL_CA_SS_UDT_TYPE_NAME és SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME.

SQLColumns, SQLProcedureColumns

Ezen felül három új, illesztő-specifikus oszlop kerül az eredményhalmazba, amelyet az SQLColumns és SQLProcedureColumns függvények visszaadnak, hogy további információkat nyújtsanak az UDT eredményhalmaz oszlopáról vagy egy UDT paraméterről. Ez a három új oszlop: SS_UDT_CATALOG_NAME, SS_UDT_SCHEMA_NAME és SS_UDT_ASSEMBLY_TYPE_NAME.

Támogatott átalakulások

SQL-ről C-re történő átváltáskor a SQL_C_WCHAR, SQL_C_BINARY és SQL_C_CHAR mind átalakíthatók SQL_SS_UDT-re. Fontos azonban megjegyezni, hogy a bináris adatokat hatszög láncsorrá alakítják át, amikor SQL_C_WCHAR és SQL_C_CHAR SQL adattípusokból konvertálnak.

C-ről SQL-re történő átkonvertáláskor a SQL_C_WCHAR, SQL_C_BINARY és SQL_C_CHAR mind átalakíthatók SQL_SS_UDT-re. Fontos azonban megjegyezni, hogy a bináris adat hatszög láncra alakul, amikor az SQL_C_WCHAR és SQL_C_CHAR SQL adattípusokból konvertálnak.

Lásd még:

SQL Server natív kliens funkciói
ISSCommandWithParameters (OLE DB)