Uso di tipi definiti dall'utente (UDT) - Modifica di dati UDTWorking with User-Defined Types - Manipulating UDT Data

SI APPLICA A: sìSQL Server noDatabase SQL di Azure noAzure SQL Data Warehouse noParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Transact-SQLTransact-SQL non fornisce una sintassi specifica per l'istruzione INSERT, UPDATE o DELETE quando si modificano i dati nelle colonne con tipo definito dall'utente (UDT).provides no specialized syntax for INSERT, UPDATE, or DELETE statements when modifying data in user-defined type (UDT) columns. Le funzioni Transact-SQLTransact-SQL CAST o CONVERT vengono utilizzate per eseguire il cast dei tipi di dati nativi al tipo UDT.The Transact-SQLTransact-SQL CAST or CONVERT functions are used to cast native data types to the UDT type.

Inserimento di dati in una colonna con tipo definito dall'utenteInserting Data in a UDT Column

Quanto segue Transact-SQLTransact-SQL consentono di inserire tre righe di dati di esempio nel punti tabella.The following Transact-SQLTransact-SQL statements insert three rows of sample data into the Points table. Il punto tipo di dati è costituita da X e Y integer valori che vengono esposti come proprietà del tipo in questione.The Point data type consists of X and Y integer values that are exposed as properties of the UDT. È necessario utilizzare la funzione CAST o CONVERT per eseguire il cast di valori delimitati da virgole valori X e Y per il punto tipo.You must use either the CAST or CONVERT function to cast the comma-delimited X and Y values to the Point type. Le prime due istruzioni utilizzano la funzione CONVERT per convertire un valore stringa per il punto tipo e la terza istruzione utilizza la funzione CAST:The first two statements use the CONVERT function to convert a string value to the Point type, and the third statement uses the CAST function:

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 datiSelecting Data

L'istruzione SELECT seguente consente di selezionare il valore binario del tipo definito dall'utente.The following SELECT statement selects the binary value of the UDT.

SELECT ID, PointValue FROM dbo.Points  

Per visualizzare l'output visualizzato in un formato leggibile, chiamare il ToString metodo per il punto tipo definito dall'utente, che converte il valore nella relativa rappresentazione di stringa.To see the output displayed in a readable format, call the ToString method of the Point UDT, which converts the value to its string representation.

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

Vengono prodotti i risultati seguenti:This produces the following results.

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

Per ottenere gli stessi risultati, è anche possibile utilizzare le funzioni Transact-SQLTransact-SQL CAST e CONVERT.You can also use the Transact-SQLTransact-SQL CAST and CONVERT functions to achieve the same results.

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

Il punto UDT espone le coordinate X e Y come proprietà che è quindi possibile selezionare singolarmente.The Point UDT exposes its X and Y coordinates as properties, which you can then select individually. L'istruzione Transact-SQLTransact-SQL seguente consente di selezionare le coordinate X e Y separatamente:The following Transact-SQLTransact-SQL statement selects the X and Y coordinates separately:

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.The X and Y properties return an integer value, which is displayed in the result set.

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

Gestione delle variabiliWorking with Variables

È possibile utilizzare le variabili specificando l'istruzione DECLARE per assegnare una variabile a un tipo definito dall'utente.You can work with variables using the DECLARE statement to assign a variable to a UDT type. Le istruzioni seguenti assegnano un valore utilizzando il Transact-SQLTransact-SQL impostare l'istruzione e visualizzare i risultati, chiamare l'UDT ToString metodo sulla variabile:The following statements assign a value using the Transact-SQLTransact-SQL SET statement and display the results by calling the UDT's ToString method on the variable:

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:The result set displays the variable value:

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

Le istruzioni Transact-SQLTransact-SQL seguenti consentono di ottenere lo stesso risultato utilizzando SELECT anziché SET per l'assegnazione delle variabili:The following Transact-SQLTransact-SQL statements achieve the same result using SELECT rather than SET for the variable assignment:

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.The difference between using SELECT and SET for variable assignment is that SELECT allows you to assign multiple variables in one SELECT statement, whereas the SET syntax requires each variable assignment to have its own SET statement.

Confronto dei datiComparing Data

È possibile usare gli operatori di confronto per confrontare i valori di tipo definito dall'utente se è stato impostato il IsByteOrdered proprietà true quando si definisce la classe.You can use comparison operators to compare values in your UDT if you have set the IsByteOrdered property to true when defining the class. Per altre informazioni, vedere creazione di un tipo definito dall'utente.For more information, see Creating a User-Defined Type.

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

È possibile confrontare valori interni dell'UDT indipendentemente i IsByteOrdered impostazione se i valori stessi sono confrontabili.You can compare internal values of the UDT regardless of the IsByteOrdered setting if the values themselves are comparable. L'istruzione Transact-SQLTransact-SQL seguente consente di selezionare le righe in cui X è maggiore di Y:The following Transact-SQLTransact-SQL statement selects rows where X is greater than 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.You can also use comparison operators with variables, as shown in this query that searches for a matching PointValue.

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

Chiamata dei metodi UDTInvoking UDT Methods

È anche possibile richiamare i metodi definiti nel tipo definito dall'utente in Transact-SQLTransact-SQL.You can also invoke methods that are defined in your UDT in Transact-SQLTransact-SQL. Il punto classe contiene tre metodi distanza, DistanceFrom, e DistanceFromXY.The Point class contains three methods, Distance, DistanceFrom, and DistanceFromXY. Per i listati di codice che definisce questi tre metodi, vedere codifica di tipi.For the code listings defining these three methods, see Coding User-Defined Types.

Quanto segue Transact-SQLTransact-SQL istruzione chiama il PointValue. Distance metodo:The following Transact-SQLTransact-SQL statement calls the PointValue.Distance method:

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

I risultati vengono visualizzati nei distanza colonna:The results are displayed in the Distance column:

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

Il DistanceFrom metodo accetta un argomento di puntare tipo di dati e Visualizza la distanza dal punto specificato a PointValue:The DistanceFrom method takes an argument of Point data type, and displays the distance from the specified point to the PointValue:

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

I risultati vengono visualizzati i risultati del DistanceFrom metodo per ogni riga nella tabella:The results display the results of the DistanceFrom method for each row in the table:

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

Il DistanceFromXY metodo accetta i singoli punti come argomenti:The DistanceFromXY method takes the points individually as arguments:

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

Il set di risultati è identico il DistanceFrom (metodo).The result set is the same as the DistanceFrom method.

Aggiornamento dei dati in una colonna con tipo definito dall'utenteUpdating Data in a UDT Column

Per aggiornare i dati in una colonna con tipo definito dall'utente, utilizzare l'istruzione Transact-SQLTransact-SQL UPDATE.To update data in a UDT column, use the Transact-SQLTransact-SQL UPDATE statement. Per aggiornare lo stato dell'oggetto è anche possibile utilizzare un metodo del tipo definito dall'utente.You can also use a method of the UDT to update the state of the object. L'istruzione Transact-SQLTransact-SQL seguente consente di aggiornare una singola riga nella tabella:The following Transact-SQLTransact-SQL statement updates a single row in the table:

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

È anche possibile aggiornare gli elementi UDT separatamente.You can also update UDT elements separately. L'istruzione Transact-SQLTransact-SQL seguente consente di aggiornare solo la coordinata Y:The following Transact-SQLTransact-SQL statement updates only the Y coordinate:

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

Se il tipo definito dall'utente è stato definito con l'ordine dei byte impostato a true, Transact-SQLTransact-SQL può valutare la colonna di tipo definito dall'utente in una clausola WHERE.If the UDT has been defined with byte ordering set to true, Transact-SQLTransact-SQL can evaluate the UDT column in a WHERE clause.

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

Limitazioni relative all'aggiornamentoUpdating Limitations

Non è possibile aggiornare più proprietà contemporaneamente utilizzando Transact-SQLTransact-SQL.You cannot update multiple properties at once using Transact-SQLTransact-SQL. L'istruzione UPDATE seguente, ad esempio, ha esito negativo e restituisce un errore perché non è possibile utilizzare due volte lo stesso nome di colonna in un'istruzione UDATE.For example, the following UPDATE statement fails with an error because you cannot use the same column name twice in one UDATE statement.

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.To update each point individually, you would need to create a mutator method in the Point UDT assembly. È quindi possibile richiamare il metodo mutatore per aggiornare l'oggetto in un'istruzione Transact-SQLTransact-SQL UPDATE, come illustrato di seguito:You can then invoke the mutator method to update the object in a Transact-SQLTransact-SQL UPDATE statement, as in the following:

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

Eliminazione di dati in una colonna con tipo definito dall'utenteDeleting Data in a UDT Column

Per eliminare dati in un tipo definito dall'utente, utilizzare l'istruzione Transact-SQLTransact-SQL DELETE.To delete data in a UDT, use the Transact-SQLTransact-SQL DELETE statement. L'istruzione seguente consente di eliminare tutte le righe della tabella che corrispondono ai criteri specificati nella clausola WHERE.The following statement deletes all rows in the table that match the criteria specified in the WHERE clause. Se si omette la clausola WHERE in un'istruzione DELETE, verranno eliminate tutte le righe della tabella.If you omit the WHERE clause in a DELETE statement, all rows in the table will be deleted.

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.Use the UPDATE statement if you want to remove the values in a UDT column while leaving other row values intact. In questo esempio PointValue viene impostato su Null.This example sets the PointValue to null.

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

Vedere ancheSee Also

Uso di tipi definiti dall'utente in SQL ServerWorking with User-Defined Types in SQL Server