Uso di tipi definiti dall'utente (UDT) - Modifica di dati UDT

Si applica a:SQL Server

Transact-SQL non fornisce alcuna sintassi specializzata per istruzioni INSERT, UPDATE o DELETE durante la modifica dei dati nelle colonne definite dall'utente. Le funzioni CAST Transact-SQL o CONVERT vengono usate per eseguire il cast dei tipi di dati nativi al tipo definito dall'utente.

Inserimento di dati in una colonna con tipo definito dall'utente

Le istruzioni Transact-SQL seguenti inseriscono tre righe di dati di esempio nella tabella Points . Il tipo di dati Point è costituito da valori integer X e Y esposti come proprietà del tipo definito dall'utente. È necessario utilizzare la funzione CAST o CONVERT per eseguire il cast dei valori X e Y delimitati da virgole al tipo Point . Le prime due istruzioni usano la funzione CONVERT per convertire un valore stringa nel tipo Point e la terza istruzione usa la funzione CAST:

INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));  
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));  
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));  

Selezione dei dati

L'istruzione SELECT seguente consente di selezionare il valore binario del tipo definito dall'utente.

SELECT ID, PointValue FROM dbo.Points  

Per visualizzare l'output visualizzato in un formato leggibile, chiamare il metodo ToString del tipo definito dall'utente point, che converte il valore nella relativa rappresentazione di stringa.

SELECT ID, PointValue.ToString() AS PointValue   
FROM dbo.Points;  

Vengono prodotti i risultati seguenti:

ID PointValue  
-- ----------  
 1 3,4  
 2 1,5  
 3 1,99  

È anche possibile usare le funzioni CAST Transact-SQL e CONVERT per ottenere gli stessi risultati.

SELECT ID, CAST(PointValue AS varchar)   
FROM dbo.Points;  
  
SELECT ID, CONVERT(varchar, PointValue)   
FROM dbo.Points;  

Il tipo definito dall'utente point espone le coordinate X e Y come proprietà, che è quindi possibile selezionare singolarmente. L'istruzione Transact-SQL seguente seleziona separatamente le coordinate X e Y:

SELECT ID, PointValue.X AS xVal, PointValue.Y AS yVal   
FROM dbo.Points;  

Le proprietà X e Y restituiscono un valore integer visualizzato nel set di risultati.

ID xVal yVal  
-- ---- ----  
 1    3    4  
 2    1    5  
 3    1   99  

Gestione delle variabili

È possibile utilizzare le variabili specificando l'istruzione DECLARE per assegnare una variabile a un tipo definito dall'utente. Le istruzioni seguenti assegnano un valore usando l'istruzione Transact-SQL SET e visualizzano i risultati chiamando il metodo ToString del tipo definito dall'utente nella variabile :

DECLARE @PointValue Point;  
SET @PointValue = (SELECT PointValue FROM dbo.Points  
    WHERE ID = 2);  
SELECT @PointValue.ToString() AS PointValue;  

Nel set di risultati viene visualizzato il valore della variabile:

PointValue  
----------  
-1,5  

Le istruzioni Transact-SQL seguenti ottengono lo stesso risultato usando SELECT anziché SET per l'assegnazione di variabili:

DECLARE @PointValue Point;  
SELECT @PointValue = PointValue FROM dbo.Points  
    WHERE ID = 2;  
SELECT @PointValue.ToString() AS PointValue;  

La differenza tra l'utilizzo di SELECT e di SET per l'assegnazione delle variabili sta nel fatto che SELECT consente di assegnare più variabili in un'istruzione SELECT, mentre la sintassi di SET richiede che ogni assegnazione di variabile contenga la relativa istruzione SET.

Confronto dei dati

È possibile usare gli operatori di confronto per confrontare i valori nel tipo definito dall'utente se è stata impostata la proprietà IsByteOrdered su true durante la definizione della classe. Per altre informazioni, vedere Creazione di un tipo di User-Defined.

SELECT ID, PointValue.ToString() AS Points   
FROM dbo.Points  
WHERE PointValue > CONVERT(Point, '2,2');  

È possibile confrontare i valori interni del tipo definito dall'utente indipendentemente dall'impostazione IsByteOrdered se i valori stessi sono confrontabili. L'istruzione Transact-SQL seguente seleziona le righe in cui X è maggiore di Y:

SELECT ID, PointValue.ToString() AS PointValue   
FROM dbo.Points  
WHERE PointValue.X < PointValue.Y;  

È anche possibile utilizzare gli operatori di confronto con le variabili, come mostrato in questa query che esegue la ricerca di un valore PointValue corrispondente.

DECLARE @ComparePoint Point;  
SET @ComparePoint = CONVERT(Point, '3,4');  
SELECT ID, PointValue.ToString() AS MatchingPoint   
FROM dbo.Points  
WHERE PointValue = @ComparePoint;  

Chiamata dei metodi UDT

È anche possibile richiamare metodi definiti nel tipo definito dall'utente in Transact-SQL. La classe Point contiene tre metodi, Distance, DistanceFrom e DistanceFromXY. Per gli elenchi di codice che definiscono questi tre metodi, vedere Codifica dei tipi di User-Defined.

L'istruzione Transact-SQL seguente chiama il metodo PointValue.Distance :

SELECT ID, PointValue.X AS [Point.X],   
    PointValue.Y AS [Point.Y],  
    PointValue.Distance() AS DistanceFromZero   
FROM dbo.Points;  

I risultati vengono visualizzati nella colonna Distanza :

ID X  Y  Distance  
-- -- -- ----------------  
 1  3  4                5  
 2  1  5 5.09901951359278  
 3  1 99 99.0050503762308  

Il metodo DistanceFrom accetta un argomento del tipo di dati Point e visualizza la distanza dal punto specificato a PointValue:

SELECT ID, PointValue.ToString() AS Pnt,  
   PointValue.DistanceFrom(CONVERT(Point, '1,99')) AS DistanceFromPoint  
FROM dbo.Points;  

I risultati visualizzano i risultati del metodo DistanceFrom per ogni riga della tabella:

ID Pnt DistanceFromPoint  
-- --- -----------------  
 1 3,4  95.0210502993942  
 2 1,5                94  
 3 1,9                90  

Il metodo DistanceFromXY accetta i punti singolarmente come argomenti:

SELECT ID, PointValue.X as X, PointValue.Y as Y,   
PointValue.DistanceFromXY(1, 99) AS DistanceFromXY   
FROM dbo.Points  

Il set di risultati corrisponde al metodo DistanceFrom .

Aggiornamento dei dati in una colonna con tipo definito dall'utente

Per aggiornare i dati in una colonna con tipo definito dall'utente, usare l'istruzione Transact-SQL UPDATE. Per aggiornare lo stato dell'oggetto è anche possibile utilizzare un metodo del tipo definito dall'utente. L'istruzione Transact-SQL seguente aggiorna una singola riga nella tabella:

UPDATE dbo.Points  
SET PointValue = CAST('1,88' AS Point)  
WHERE ID = 3  

È anche possibile aggiornare gli elementi UDT separatamente. L'istruzione Transact-SQL seguente aggiorna solo la coordinata Y:

UPDATE dbo.Points  
SET PointValue.Y = 99  
WHERE ID = 3  

Se il tipo definito dall'utente è stato definito con l'ordinamento dei byte impostato su true, Transact-SQL può valutare la colonna UDT in una clausola WHERE.

UPDATE dbo.Points  
SET PointValue = '4,5'  
WHERE PointValue = '3,4';  

Limitazioni relative all'aggiornamento

Non è possibile aggiornare più proprietà contemporaneamente usando Transact-SQL. Ad esempio, l'istruzione UPDATE seguente ha esito negativo con un errore perché non è possibile usare due volte lo stesso nome di colonna in un'istruzione UPDATE.

UPDATE dbo.Points  
SET PointValue.X = 5, PointValue.Y = 99  
WHERE ID = 3  

Per aggiornare ogni punto singolarmente, è necessario creare un metodo mutatore nell'assembly del tipo definito dall'utente Point. È quindi possibile richiamare il metodo mutatore per aggiornare l'oggetto in un'istruzione Transact-SQL UPDATE, come illustrato di seguito:

UPDATE dbo.Points  
SET PointValue.SetXY(5, 99)  
WHERE ID = 3  

Eliminazione di dati in una colonna con tipo definito dall'utente

Per eliminare i dati in un tipo definito dall'utente, usare l'istruzione Transact-SQL DELETE. L'istruzione seguente consente di eliminare tutte le righe della tabella che corrispondono ai criteri specificati nella clausola WHERE. Se si omette la clausola WHERE in un'istruzione DELETE, verranno eliminate tutte le righe della tabella.

DELETE FROM dbo.Points  
WHERE PointValue = CAST('1,99' AS Point)  

Utilizzare l'istruzione UPDATE se si desidera rimuovere i valori in una colonna con tipo definito dall'utente, senza tuttavia modificare i valori di altre righe. In questo esempio PointValue viene impostato su Null.

UPDATE dbo.Points  
SET PointValue = null  
WHERE ID = 2  

Vedere anche

Uso di tipi definiti dall'utente in SQL Server