Esecuzione di operazioni su tipi definiti dall'utente
È possibile eseguire una vasta gamma di operazioni sulle istanze di tipi definiti dall'utente. Di seguito vengono descritte alcune di queste operazioni:
Richiamo di metodi o recupero di proprietà di un tipo definito dall'utente.
Conversione di tipi di dati.
Restituzione di valori di tipi definiti dall'utente a un client SQL.
Utilizzo di clausole ORDER BY.
Creazione di indici per colonne definite dall'utente.
Creazione di colonne calcolate.
Richiamo di metodi o recupero di proprietà di tipi definiti dall'utente
È possibile richiamare un metodo o recuperare una proprietà di un tipo definito dall'utente in qualsiasi posizione in cui può essere presente un'espressione scalare. È necessario disporre dell'autorizzazione EXECUTE per il tipo specifico. I metodi che modificano lo stato dei dati all'esterno di un'istruzione UPDATE verranno eseguiti, ma le modifiche verranno ignorate perché nelle query non sono consentiti i metodi modificabili.
Le stringhe restitute da metodi di tipo definito dall'utente assumono le regole di confronto del database in cui è stato creato il tipo definito dall'utente, indipendentemente dal database corrente.
Attenzione |
---|
I metodi e le proprietà utilizzati nelle istruzioni SELECT non devono avere effetti collaterali. Se un metodo ha effetti collaterali, i risultati non saranno deterministici. |
Attenzione |
---|
Se si richiama un metodo o una proprietà in un tipo definito dall'utente nel quale vengono create colonne calcolate e ciò avviene durante un'operazione sulla colonna calcolata, le autorizzazioni EXECUTE per il tipo non verranno controllate. Il controllo delle autorizzazioni viene invece eseguito al momento della creazione della colonna calcolata. |
Per richiamare un metodo o recuperare una proprietà di un tipo definito dall'utente
[!NOTA]
SQL Server Management Studio restituisce i valori dei tipi definiti dall'utente in una rappresentazione binaria. Per restituire tali valori in formato stringa o XML, è possibile utilizzare CAST o CONVERT.
Conversione di tipi di dati con i tipi definiti dall'utente
Per i tipi definiti dall'utente è possibile eseguire conversioni implicite ed esplicite, come è illustrato nella tabella seguente.
|
A: Tipo definito dall'utente |
Binario |
nvarchar |
xml |
---|---|---|---|---|
DA: Tipo definito dall'utente |
|
Esplicita |
Esplicita |
Implicita |
Binario |
Implicita |
|
|
|
nvarchar |
Implicita |
|
|
|
xml |
Implicita |
|
|
|
Nell'esempio seguente viene eseguita la conversione esplicita di un'istanza del tipo definito dall'utente ComplexNumber in xml e viene quindi richiamata su di essa un'espressione XQuery.
DECLARE @c ComplexNumber
SET @c = CONVERT(ComplexNumber, '(1,2i)')
SELECT CAST(@c AS xml).query('//Real/text()')
Nell'esempio seguente viene eseguita la conversione implicita di dati xml in un'istanza del tipo definito dall'utente ComplexNumber.
DECLARE @x xml, @u ComplexNumber
SET @x = '<ComplexNumber><Real>100</Real><Imaginary>4</Imaginary></ComplexNumber>'
SET @u = @x -- implicit convert
SELECT @u.ToString()
Per ulteriori informazioni, vedere CAST e CONVERT (Transact-SQL).
Restituzione di valori di tipi definiti dall'utente a un client SQL
Quando una colonna o un'espressione di un tipo definito dall'utente viene restituita a un client SQL come risultato di un'istruzione SELECT o FETCH, la modalità di accesso dell'API del client alla colonna varia a seconda che l'API sia di tipo gestito (ADO.NET) o non gestito (ODBC o OLE DB). Se il client utilizza ADO.NET, è in grado di recuperare un'istanza del tipo come valore binario utilizzando il metodo GetValue sulla classe SqlDataReader oppure come oggetto. Se il client utilizza OLE DB, riceverà i valori del tipo definito dall'utente come valore binario. Se il client utilizza ODBC, riceverà il valore del tipo definito dall'utente unicamente come valore binario.
Utilizzo delle clausole ORDER BY, GROUP BY e PARTITION BY con i tipi definiti dall'utente
È possibile eseguire operazioni ORDER BY, GROUP BY e PARTITION BY con i tipi definiti dall'utente se tali tipi supportano l'ordinamento binario. L'ordinamento di un tipo è binario se il flag IsByteOrdered nell'attributo SqlUserDefinedType specificato come parte della definizione del tipo è impostato su true. Questo flag indica che l'ordine della rappresentazione binaria del tipo è semanticamente corretto per il tipo specifico.
Creazione di indici in tipi di colonne definiti dall'utente
È possibile creare indici in tipi di colonne definiti dall'utente se tali tipi supportano l'ordinamento binario. È inoltre possibile creare indici in colonne calcolate definite come chiamate di metodo per una colonna di tipo definito dall'utente, se i metodi sono contrassegnati come deterministici. Per ulteriori informazioni, vedere Tipi CLR definiti dall'utente.