Uso di tipi definiti dall'utente in SQL Server Native Client

Si applica a: SQL Server Database SQL di Azure Not supported. Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)

Importante

SQL Server Native Client (spesso abbreviato SNAC) è stato rimosso da SQL Server 2022 (16.x) e SQL Server Management Studio 19 (SSMS). SQL Server Native Client (SQLNCLI o SQLNCLI11) e il provider Microsoft OLE DB legacy per SQL Server (SQLOLEDB) non sono consigliati per lo sviluppo di nuove applicazioni. Passare al nuovo Microsoft OLE DB Driver (MSOLEDBSQL) per SQL Server o alla versione più recente di Microsoft ODBC Driver per SQL Server . Per SQLNCLI fornito come componente di SQL Server motore di database (versioni da 2012 a 2019), vedere questa eccezione relativa al ciclo di vita del supporto.

SQL Server 2005 (9.x) ha introdotto i tipi definiti dall'utente (UDT). I tipi definiti dall'utente estendono il sistema di tipi SQL consentendo di archiviare oggetti e strutture di dati personalizzate in un database di SQL Server. I tipi definiti dall'utente possono contenere più tipi di dati e possono assumere comportamenti, differenziandoli dai tipi di dati alias tradizionali costituiti da un singolo tipo di dati di sistema di SQL Server. I tipi definiti dall'utente vengono definiti utilizzando uno dei linguaggi supportati da .NET Common Language Runtime (CLR) che generano codice verificabile, Sono inclusi C# e Visual Basic .NET. I dati vengono esposti come campi e proprietà di una classe o struttura .NET mentre i comportamenti vengono definiti dai metodi della classe o della struttura.

È possibile usare un UDT come definizione di colonna di una tabella, come variabile in un batch Transact-SQL oppure come argomento di una funzione o di una stored procedure Transact-SQL.

Provider OLE DB di SQL Server Native Client

Il provider OLE DB di SQL Server Native Client supporta tipi definiti dall'utente come tipi binari con informazioni sui metadati, che consentono di gestire i tipi definiti dall'utente come oggetti . Le colonne con tipo definito dall'utente vengono esposte come DBTYPE_UDT e i relativi metadati vengono esposti tramite l'interfaccia OLE DB principale IColumnRowset e la nuova interfaccia ISSCommandWithParameters.

Nota

Il metodo IRowsetFind::FindNextRow non funziona con il tipo di dati UDT. Se il tipo definito dall'utente viene utilizzato come tipo di colonna di ricerca, viene restituito DB_E_BADCOMPAREOP.

Associazione dati e coercizioni

Nella tabella seguente vengono descritte l'associazione e la coercizione che si verificano quando si usano i tipi di dati elencati con un tipo definito dall'utente di SQL Server. Le colonne definite dall'utente vengono esposte tramite il provider OLE DB di SQL Server Native Client come DBTYPE_UDT. È possibile ottenere i metadati tramite i set di righe dello schema appropriati in modo da potere gestire i tipi definiti personalizzati come oggetti.

Tipo di dati Al server

UDT
Al server

non UDT
Dal server

UDT
Dal server

non UDT
DBTYPE_UDT Supportato6 Errore1 Supportato6 Errore5
DBTYPE_BYTES Supportato6 N/D2 Supportato6 N/D2
DBTYPE_WSTR Supportato3,6 N/D2 Supportato4,6 N/D2
DBTYPE_BSTR Supportato3,6 N/D2 Supportato4 N/D2
DBTYPE_STR Supportato3,6 N/D2 Supportato4,6 N/D2
DBTYPE_IUNKNOWN Non supportato N/D2 Non supportato N/D2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Supportato6 N/D2 Supportato4 N/D2
DBTYPE_VARIANT (VT_BSTR) Supportato3,6 N/D2 N/D N/D2

1Se viene specificato un tipo di server diverso da DBTYPE_UDT con ICommandWithParameters::SetParameterInfo e il tipo di funzione di accesso è DBTYPE_UDT, si verifica un errore quando viene eseguita l'istruzione (DB_E_ERRORSOCCURRED; lo stato del parametro è DBSTATUS_E_BADACCESSOR). In caso contrario, i dati vengono inviati al server, ma il server restituisce un errore indicando che non è possibile eseguire una conversione implicita dal tipo definito dall'utente al tipo di dati del parametro.

2Oltre l'ambito di questo argomento.

3Si verifica la conversione dei dati da stringa esadecimale a dati binari.

4Si verifica la conversione dei dati da dati binari a stringa esadecimale.

5La convalida può verificarsi durante la creazione della funzione di accesso o durante il recupero, l'errore è DB_E_ERRORSOCCURRED, lo stato dell'associazione impostato su DBBINDSTATUS_UNSUPPORTEDCONVERSION.

6Può essere usato BY_REF.

DBTYPE_NULL e DBTYPE_EMPTY possono essere associati per i parametri di input ma non per i parametri di output o per i risultati. Se vengono associati per i parametri di input, lo stato deve essere impostato su DBSTATUS_S_ISNULL o DBSTATUS_S_DEFAULT.

DBTYPE_UDT può essere convertito anche in DBTYPE_EMPTY e DBTYPE_NULL, ma DBTYPE_NULL e DBTYPE_EMPTY non possono essere convertiti in DBTYPE_UDT. È coerente con DBTYPE_BYTES.

Nota

Viene usata una nuova interfaccia per la gestione dei tipi definiti dall'utente come parametri, ISSCommandWithParameters, che eredita da ICommandWithParameters. Le applicazioni devono utilizzare questa interfaccia per impostare almeno SSPROP_PARAM_UDT_NAME del set di proprietà DBPROPSET_SQLSERVERPARAMETER per i parametri UDT. In caso contrario, ICommand::Execute restituirà DB_E_ERRORSOCCURRED. Questo set di proprietà e questa interfaccia vengono descritti più avanti in questo argomento.

Se un tipo definito dall'utente viene inserito in una colonna che non consente di contenere tutti i relativi dati, ICommand::Execute restituirà S_OK con lo stato DB_E_ERRORSOCCURRED.

Le conversioni dei dati fornite dai servizi principali OLE DB (IDataConvert) non sono applicabili a DBTYPE_UDT. Non sono supportate altre associazioni.

Aggiunte e modifiche ai set di righe OLE DB

SQL Server Native Client aggiunge nuovi valori o modifiche a molti set di righe dello schema OLE DB di base.

Set di righe dello schema PROCEDURE_PARAMETERS

Al set di righe dello schema PROCEDURE_PARAMETERS sono state effettuate le seguenti aggiunte.

Nome colonna Tipo Descrizione
SS_UDT_CATALOGNAME DBTYPE_WSTR Identificatore del nome in tre parti.
SS_UDT_SCHEMANAME DBTYPE_WSTR Identificatore del nome in tre parti.
SS_UDT_NAME DBTYPE_WSTR Identificatore del nome in tre parti.
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Nome completo dell'assembly che include il nome del tipo e l'identificazione dell'assembly necessaria a cui deve fare riferimento CLR.

Set di righe dello schema SQL_ASSEMBLIES

Il provider OLE DB di SQL Server Native Client espone un nuovo set di righe dello schema specifico del provider che descrive i tipi definiti dall'utente registrati. Il server ASSEMBLY può essere specificato come DBTYPE_WSTR, ma non è presente nel set di righe. Se non viene specificato, il set di righe imposterà come valore predefinito il server corrente. Il set di righe dello schema SQL_ASSEMBLIES viene definito nella tabella seguente.

Nome colonna Tipo Descrizione
ASSEMBLY_CATALOG DBTYPE_WSTR Nome del catalogo dell'assembly contenente il tipo.
ASSEMBLY_SCHEMA DBTYPE_WSTR Nome dello schema o nome del proprietario dell'assembly contenente il tipo. Sebbene l'ambito degli assembly sia il database e non lo schema, gli assembly dispongono di un proprietario qui rappresentato.
ASSEMBLY_NAME DBTYPE_WSTR Nome dell'assembly contenente il tipo.
ASSEMBLY_ID DBTYPE_UI4 ID oggetto dell'assembly contenente il tipo.
PERMISSION_SET DBTYPE_WSTR Valore che indica l'ambito di accesso per l'assembly. I valori includono "SAFE", "EXTERNAL_ACCESS" e "UNSAFE".
ASSEMBLY_BINARY DBTYPE_BYTES Rappresentazione binaria dell'assembly.

Set di righe dello schema SQL_ASSEMBLIES_ DEPENDENCIES

Il provider OLE DB di SQL Server Native Client espone un nuovo set di righe dello schema specifico del provider che descrive le dipendenze dell'assembly per un server specificato. ASSEMBLY_SERVER può essere specificato dal chiamante come DBTYPE_WSTR, ma non è presente nel set di righe. Se non viene specificato, il set di righe imposterà come valore predefinito il server corrente. Il set di righe dello schema SQL_ASSEMBLY_DEPENDENCIES viene definito nella tabella seguente.

Nome colonna Tipo Descrizione
ASSEMBLY_CATALOG DBTYPE_WSTR Nome del catalogo dell'assembly contenente il tipo.
ASSEMBLY_SCHEMA DBTYPE_WSTR Nome dello schema o nome del proprietario dell'assembly contenente il tipo. Sebbene l'ambito degli assembly sia il database e non lo schema, gli assembly dispongono di un proprietario qui rappresentato.
ASSEMBLY_ID DBTYPE_UI4 ID oggetto dell'assembly.
REFERENCED_ASSEMBLY_ID DBTYPE_UI4 ID oggetto dell'assembly a cui viene fatto riferimento.

Set di righe dello schema SQL_USER_TYPES

Il provider OLE DB di SQL Server Native Client espone un nuovo set di righe dello schema, SQL_U edizione Standard R_TYPES, che descrive quando vengono aggiunti i tipi definiti dall'utente registrati per un server specificato. UDT_SERVER deve essere specificato dal chiamante come DBTYPE_WSTR, ma non è presente nel set di righe. Il set di righe dello schema SQL_USER_TYPES viene definito nella tabella seguente.

Nome colonna Tipo Descrizione
UDT_CATALOGNAME DBTYPE_WSTR Per le colonne con tipo definito dall'utente questa proprietà è una stringa che specifica il nome del catalogo in cui viene definito il tipo definito dall'utente.
UDT_SCHEMANAME DBTYPE_WSTR Per le colonne con tipo definito dall'utente questa proprietà è una stringa che specifica il nome dello schema in cui viene definito il tipo definito dall'utente.
UDT_NAME DBTYPE_WSTR Nome dell'assembly contenente la classe UDT.
UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Il nome completo del tipo (AQN) include il nome del tipo preceduto dallo spazio dei nomi se applicabile.

Set di righe dello schema COLUMNS

Le aggiunte al set di righe dello schema COLUMNS includono le colonne seguenti.

Nome colonna Tipo Descrizione
SS_UDT_CATALOGNAME DBTYPE_WSTR Per le colonne con tipo definito dall'utente questa proprietà è una stringa che specifica il nome del catalogo in cui viene definito il tipo definito dall'utente.
SS_UDT_SCHEMANAME DBTYPE_WSTR Per le colonne con tipo definito dall'utente questa proprietà è una stringa che specifica il nome dello schema in cui viene definito il tipo definito dall'utente.
SS_UDT_NAME DBTYPE_WSTR Nome del tipo definito dall'utente.
SS_UDT_ASSEMBLY_TYPENAME DBTYPE_WSTR Il nome completo del tipo (AQN) include il nome del tipo preceduto dallo spazio dei nomi se applicabile.

Aggiunte e modifiche ai set di proprietà OLE DB

SQL Server Native Client aggiunge nuovi valori o modifiche a molti dei set di proprietà OLE DB principali.

Set di proprietà DBPROPSET_SQLSERVERPARAMETER

Per supportare tipi definiti dall'utente tramite OLE DB, SQL Server Native Client implementa il nuovo set di proprietà DBPROP edizione Standard T_SQL edizione Standard RVERPARAMETER che contiene i valori seguenti.

Nome Tipo Descrizione
SSPROP_PARAM_UDT_CATALOGNAME DBTYPE_WSTR Identificatore del nome in tre parti.

Per i parametri UDT questa proprietà è una stringa che specifica il nome del catalogo in cui viene definito il tipo definito dall'utente.
SSPROP_PARAM_UDT_SCHEMANAME DBTYPE_WSTR Identificatore del nome in tre parti.

Per i parametri UDT questa proprietà è una stringa che specifica il nome dello schema in cui viene definito il tipo definito dall'utente.
SSPROP_PARAM_UDT_NAME DBTYPE_WSTR Identificatore del nome in tre parti.

Per le colonne con tipo definito dall'utente questa proprietà è una stringa che specifica il nome costituito da una sola parte del tipo definito dall'utente.

SSPROP_PARAM_UDT_NAME è obbligatorio. SSPROP_PARAM_UDT_CATALOGNAME e SSPROP_PARAM_UDT_SCHEMANAME sono facoltativi. Se una delle proprietà viene specificata in modo non corretto, verrà restituito DB_E_ERRORSINCOMMAND. Se non vengono specificati SSPROP_PARAM_UDT_CATALOGNAME e SSPROP_PARAM_UDT_SCHEMANAME, il tipo definito dall'utente dovrà essere definito nello stesso database e nello stesso schema della tabella. Se la definizione UDT non è presente nello stesso schema della tabella, ma nello stesso database, sarà necessario specificare SSPROP_PARAM_UDT_SCHEMANAME. Se la definizione UDT è presente in un database diverso, sarà necessario specificare SSPROP_PARAM_UDT_CATALOGNAME e SSPROP_PARAM_UDT_SCHEMANAME.

Set di proprietà DBPROPSET_SQLSERVERCOLUMN

Per supportare la creazione di tabelle nell'interfaccia ITableDefinition, SQL Server Native Client aggiunge le tre nuove colonne seguenti al set di proprietà DBPROP edizione Standard T_SQL edizione Standard RVERCOLUMN.

Nome Descrizione Tipo Descrizione
SSPROP_COL_UDT_CATALOGNAME UDT_CATALOGNAME VT_BSTR Per le colonne di tipo DBTYPE_UDT questa proprietà è una stringa che specifica il nome del catalogo in cui viene definito il tipo definito dall'utente.
SSPROP_COL_UDT_SCHEMANAME UDT_SCHEMANAME VT_BSTR Per le colonne di tipo DBTYPE_UDT questa proprietà è una stringa che specifica il nome dello schema in cui viene definito il tipo definito dall'utente.
SSPROP_COL_UDT_NAME UDT_NAME VT_BSTR Per le colonne di tipo DBTYPE_UDT questa proprietà è una stringa che specifica il nome costituito da una singola parte del tipo definito dall'utente. Per gli altri tipi di colonna questa proprietà restituisce una stringa vuota.

Nota

I tipi definiti dall'utente non sono presenti nel set di righe dello schema PROVIDER_TYPES. Tutte le colonne dispongono dell'accesso in lettura e scrittura.

ADO farà riferimento a queste proprietà tramite la voce corrispondente nella colonna Descrizione.

SSPROP_COL_UDTNAME è obbligatorio. SSPROP_COL_UDT_CATALOGNAME e SSPROP_COL_UDT_SCHEMANAME sono facoltativi. Se una delle proprietà viene specificata in modo non corretto, verrà restituito DB_E_ERRORSINCOMMAND.

Se non vengono specificati SSPROP_COL_UDT_CATALOGNAME e SSPROP_COL_UDT_SCHEMANAME, il tipo definito dall'utente dovrà essere definito nello stesso database e nello stesso schema della tabella.

Se la definizione UDT non è presente nello stesso schema della tabella, ma nello stesso database, sarà necessario specificare SSPROP_COL_UDT_SCHEMANAME.

Se la definizione UDT è presente in un database diverso, sarà necessario specificare SSPROP_COL_UDT_CATALOGNAME e SSPROP_COL_UDT_SCHEMANAME.

Aggiunte e modifiche alle interfacce OLE DB

SQL Server Native Client aggiunge nuovi valori o modifiche a molte delle interfacce OLE DB principali.

Interfaccia ISSCommandWithParameters

Per supportare i tipi definiti dall'utente tramite OLE DB, SQL Server Native Client implementa una serie di modifiche, inclusa l'aggiunta dell'interfaccia ISSCommandWithParameters . Questa nuova interfaccia eredita dall'interfaccia OLE DB principale ICommandWithParameters. Oltre ai tre metodi ereditati da ICommandWithParameters; GetParameterInfo, MapParameterNames e SetParameterInfo; ISSCommandWithParameters fornisce i metodi GetParameterProperties e SetParameterProperties usati per gestire tipi di dati specifici del server.

Nota

L'interfaccia ISSCommandWithParameters usa anche la nuova struttura SSPARAMPROPS.

Interfaccia IColumnsRowset

Oltre all'interfaccia ISSCommandWithParameters , SQL Server Native Client aggiunge anche nuovi valori al set di righe restituito dalla chiamata al metodo IColumnsRowset::GetColumnRowset , incluso quanto segue.

Nome colonna Tipo Descrizione
DBCOLUMN_SS_UDT_CATALOGNAME DBTYPE_WSTR Identificatore del nome di catalogo del tipo definito dall'utente.
DBCOLUMN_SS_UDT_SCHEMANAME DBTYPE_WSTR Identificatore del nome dello schema del tipo definito dall'utente.
DBCOLUMN_SS_UDT_NAME DBTYPE_WSTR Identificatore del nome del tipo definito dall'utente.
DBCOLUMN_SS_ASSEMBLY_TYPENAME DBTYPE_WSTR Nome completo dell'assembly che include il nome del tipo e l'identificazione dell'assembly necessaria a cui deve fare riferimento CLR.

È possibile differenziare una colonna con tipo definito dall'utente del server dagli altri tipi binari quando DBCOLUMN_TYPE è impostato su DBTYPE_UDT analizzando i metadati UDT aggiunti sopra specificati. Se tali dati sono parzialmente completi, il tipo di server sarà un tipo definito dall'utente. Per i tipi di server non UDT queste colonne vengono sempre restituite come NULL.

Driver ODBC di SQL Server Native Client

Sono state apportate alcune modifiche nel driver ODBC di SQL Server Native Client per supportare i tipi definiti dall'utente. Il driver ODBC di SQL Server Native Client esegue il mapping del tipo di dati SQL Server UDT a SQL_SS_UDT identificatore del tipo di dati SQL specifico del driver. Le colonne con tipo definito dall'utente vengono rilevate come SQL_SS_UDT. Se si esegue il mapping esplicito di una colonna UDT a un altro tipo in un'istruzione SQL utilizzando i metodi ToString o ToXMLString del tipo definito dall'utente o tramite la funzione CAST/CONVERT , il tipo della colonna nel set di risultati riflette il tipo effettivo in cui è stata convertita la colonna

SQLColAttribute, SQLDescribeParam, SQLGetDescField

Sono stati aggiunti quattro nuovi campi descrittori specifici del driver per fornire informazioni aggiuntive per una colonna UDT di un set di risultati o un parametro definito dall'utente della stored procedure/query con parametri, da recuperare tramite le funzioni SQLColAttribute, SQLDescribeParam e SQLGetDescField .

I quattro nuovi campi di descrizione aggiunti sono SQL_CA_SS_UDT_CATALOG_NAME, SQL_CA_SS_UDT_SCHEMA_NAME, SQL_CA_SS_UDT_TYPE_NAME e SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME.

SQLColumns, SQLProcedureColumns

Inoltre, vengono aggiunte tre nuove colonne specifiche del driver al set di risultati restituito dalle funzioni SQLColumns e SQLProcedureColumns per fornire informazioni aggiuntive su una colonna del set di risultati definito dall'utente o un parametro definito dall'utente. Queste tre nuove colonne sono SS_UDT_CATALOG_NAME, SS_UDT_SCHEMA_NAME e SS_UDT_ASSEMBLY_TYPE_NAME.

Conversioni supportate

Quando si esegue la conversione dai tipi di dati SQL ai tipi di dati C, SQL_C_WCHAR, SQL_C_BINARY e SQL_C_CHAR possono essere convertiti tutti in SQL_SS_UDT. Tenere tuttavia presente che i dati binari vengono convertiti in una stringa esadecimale durante la conversione dai tipi di dati SQL SQL_C_WCHAR e SQL_C_CHAR.

Quando si esegue la conversione dai tipi di dati C ai tipi di dati SQL, SQL_C_WCHAR, SQL_C_BINARY e SQL_C_CHAR possono essere convertiti tutti in SQL_SS_UDT. Tenere tuttavia presente che i dati binari vengono convertiti in una stringa esadecimale durante la conversione dai tipi di dati SQL SQL_C_WCHAR e SQL_C_CHAR.

Vedi anche

Funzionalità di SQL Server Native Client
ISSCommandWithParameters (OLE DB)