Modificare i dati di tipo definito dall'utente (UDT)
Si applica a:SQL Server
Transact-SQL non fornisce sintassi specializzata per INSERT
istruzioni , UPDATE
o DELETE
durante la modifica dei dati nelle colonne definite dall'utente. Le funzioni Transact-SQL CAST
o CONVERT
vengono usate per eseguire il cast dei tipi di dati nativi al tipo definito dall'utente.
Inserire dati in una colonna 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 usare la funzione CAST
o CONVERT
per eseguire il cast dei valori X e Y delimitati da virgole al tipo di 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));
Selezionare i dati
Nell'istruzione SELECT
seguente viene selezionato 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 di Point
, che converte il valore nella relativa rappresentazione di stringa.
SELECT ID, PointValue.ToString() AS PointValue
FROM dbo.Points;
Ecco il set di risultati.
ID PointValue
-- ----------
1 3,4
2 1,5
3 1,99
È anche possibile usare le funzioni Transact-SQL CAST
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 le coordinate X e Y separatamente:
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
Usare le variabili
È possibile usare le variabili usando 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 AS 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 AS Point;
SELECT @PointValue = PointValue
FROM dbo.Points
WHERE ID = 2;
SELECT @PointValue.ToString() AS PointValue;
La differenza tra l'uso di SELECT
e SET
per l'assegnazione di variabili consiste nel fatto che SELECT
consente di assegnare più variabili in un'unica istruzione SELECT
, mentre la sintassi SET
richiede che ogni assegnazione di variabile abbia una propria istruzione SET
.
Confrontare i dati
È possibile usare gli operatori di confronto per confrontare i valori nel tipo definito dall'utente se si imposta la proprietà IsByteOrdered
su true
durante la definizione della classe. Per altre informazioni, vedere Creare tipi definiti dall'utente.
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 usare operatori di confronto con variabili, come illustrato in questa query che cerca un PointValue
corrispondente.
DECLARE @ComparePoint AS Point;
SET @ComparePoint = CONVERT (Point, '3,4');
SELECT ID, PointValue.ToString() AS MatchingPoint
FROM dbo.Points
WHERE PointValue = @ComparePoint;
Richiamare i metodi definiti dall'utente
È 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 Creare tipi definiti dall'utente con ADO.NET.
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 Distance
:
ID X Y Distance
-- -- -- ----------------
1 3 4 5
2 1 5 5.09901951359278
3 1 99 99.0050503762308
Il metodo DistanceFrom
accetta un argomento di Point
tipo di dati e visualizza la distanza dal punto specificato al 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 è uguale al metodo DistanceFrom
.
Aggiornare i dati in una colonna definita dall'utente
Per aggiornare i dati in una colonna definita 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 viene definito con l'ordinamento dei byte impostato su true
, Transact-SQL può valutare la colonna definito dall'utente in una clausola WHERE
.
UPDATE dbo.Points
SET PointValue = '4,5'
WHERE PointValue = '3,4';
Limitazioni degli aggiornamenti
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 lo stesso nome di colonna due volte 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 UDT Point
. È quindi possibile richiamare il metodo mutatore per aggiornare l'oggetto in un'istruzione Transact-SQL UPDATE
, come nell'esempio seguente:
UPDATE dbo.Points
SET PointValue.SetXY(5, 99)
WHERE ID = 3;
Eliminare i dati in una colonna definita dall'utente
Per eliminare i dati in un tipo definito dall'utente, usare l'istruzione Transact-SQL DELETE
. L'istruzione seguente elimina tutte le righe della tabella che soddisfano i criteri specificati nella clausola WHERE
. Se si omette la clausola WHERE
in un'istruzione DELETE
, tutte le righe della tabella vengono eliminate.
DELETE dbo.Points
WHERE PointValue = CAST ('1,99' AS Point);
Usare l'istruzione UPDATE
se si desidera rimuovere i valori in una colonna definita dall'utente lasciando invariati altri valori di riga. In questo esempio il PointValue
viene impostato su Null.
UPDATE dbo.Points
SET PointValue = NULL
WHERE ID = 2;