Arbeiten mit benutzerdefinierten Typen: Bearbeiten von UDT-DatenWorking with User-Defined Types - Manipulating UDT Data

GILT FÜR: jaSQL Server neinAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Transact-SQLTransact-SQL stellt keine spezialisierte Syntax für INSERT-, UPDATE- oder DELETE-Anweisungen zum Ändern von Daten in Spalten vom benutzerdefinierten Typ (User-defined Type, UDT) bereit.provides no specialized syntax for INSERT, UPDATE, or DELETE statements when modifying data in user-defined type (UDT) columns. Die Transact-SQLTransact-SQL-Funktionen CAST oder CONVERT werden verwendet, um systemeigene Datentypen in den benutzerdefinierten Typ (UDT) umzuwandeln.The Transact-SQLTransact-SQL CAST or CONVERT functions are used to cast native data types to the UDT type.

Einfügen von Daten in eine UDT-SpalteInserting Data in a UDT Column

Die folgenden Transact-SQLTransact-SQL -Anweisungen fügen drei Zeilen Beispieldaten in die Punkte Tabelle.The following Transact-SQLTransact-SQL statements insert three rows of sample data into the Points table. Die Punkt -Datentyp besteht aus X- und Y-Ganzzahlwerten, die als Eigenschaften des UDT verfügbar gemacht werden.The Point data type consists of X and Y integer values that are exposed as properties of the UDT. Sie müssen der CAST- oder CONVERT-Funktion verwenden, um die durch Kommas getrennten X- und Y-Werte die Punkt Typ.You must use either the CAST or CONVERT function to cast the comma-delimited X and Y values to the Point type. Die ersten beiden Anweisungen verwenden die CONVERT-Funktion konvertiert einen Zeichenfolgenwert, der Punkt Typ und die dritte Anweisung verwendet die CAST-Funktion: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));  

Auswählen von DatenSelecting Data

Die folgende SELECT-Anweisung wählt den Binärwert des UDTs aus.The following SELECT statement selects the binary value of the UDT.

SELECT ID, PointValue FROM dbo.Points  

Um die Ausgabe in einem lesbaren Format anzuzeigen, rufen die ToString Methode der Punkt UDT, der den Wert in seine Zeichenfolgendarstellung konvertiert.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;  

Hierdurch werden folgende Ergebnisse erzielt.This produces the following results.

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

Sie können auch die Transact-SQLTransact-SQL-Funktionen CAST und CONVERT verwenden, um dieselben Ergebnisse zu erreichen.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;  

Die Punkt UDT macht seine X- und Y-Koordinaten als Eigenschaften, die Sie dann einzeln auswählen können.The Point UDT exposes its X and Y coordinates as properties, which you can then select individually. Die folgende Transact-SQLTransact-SQL-Anweisung wählt die X- und die Y-Koordinate getrennt aus: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;  

Die X-Eigenschaft und die Y-Eigenschaft geben einen ganzzahligen Wert zurück, der im Resultset angezeigt wird.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  

Arbeiten mit VariablenWorking with Variables

Sie können mit Variablen arbeiten, indem Sie die DECLARE-Anweisung verwenden, um einem UDT eine Variable zuzuweisen.You can work with variables using the DECLARE statement to assign a variable to a UDT type. Die folgenden Anweisungen weisen Sie einen Wert mit dem Transact-SQLTransact-SQL SET-Anweisung aus, und zeigen Sie die Ergebnisse durch Aufrufen des UDTS ToString Methode für die Variable: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;  

Das Resultset zeigt den Wert der Variablen an:The result set displays the variable value:

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

Mit den folgenden Transact-SQLTransact-SQL-Anweisungen wird dasselbe Ergebnis erzielt. Dabei wird für die Variablenzuweisung SELECT statt SET verwendet: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;  

Der Unterschied zwischen der Verwendung von SELECT statt SET für die Variablenzuweisung besteht darin, dass SELECT ermöglicht, mehrere Variable in einer SELECT-Anweisung zuzuweisen, während die SET-Syntax erfordert, dass jede Variable durch eine eigene SET-Anweisung zugewiesen wird.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.

Vergleichen von DatenComparing Data

Sie können Vergleichsoperatoren verwenden, um Werte in Ihrem UDT vergleichen, wenn Sie festgelegt haben die IsByteOrdered Eigenschaft "true" beim Definieren der Klasse.You can use comparison operators to compare values in your UDT if you have set the IsByteOrdered property to true when defining the class. Weitere Informationen finden Sie unter erstellen einen benutzerdefinierten Typ.For more information, see Creating a User-Defined Type.

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

Sie können vergleichen, interne Werte des UDTS unabhängig von der IsByteOrdered Einstellung aus, wenn die Werte selbst vergleichbar sind.You can compare internal values of the UDT regardless of the IsByteOrdered setting if the values themselves are comparable. Die folgende Transact-SQLTransact-SQL-Anweisung wählt die Zeilen aus, in denen X größer ist als 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;  

Vergleichsoperatoren können auch mit Variablen verwendet werden, wie in dieser Abfrage gezeigt, in der nach einem übereinstimmenden PointValue gesucht wird.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;  

Aufrufen von UDT-MethodenInvoking UDT Methods

Sie können auch Methoden aufrufen, die im UDT in Transact-SQLTransact-SQL definiert sind.You can also invoke methods that are defined in your UDT in Transact-SQLTransact-SQL. Die Punkt -Klasse enthält drei Methoden, Abstand, DistanceFrom, und DistanceFromXY.The Point class contains three methods, Distance, DistanceFrom, and DistanceFromXY. In den codeauflistungen, die diese drei Methoden definieren, finden Sie unter Codieren benutzerdefinierter Typen.For the code listings defining these three methods, see Coding User-Defined Types.

Die folgenden Transact-SQLTransact-SQL Anweisung ruft die PointValue.Distance Methode: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;  

Die Ergebnisse werden angezeigt, der Abstand Spalte: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  

Die DistanceFrom Methode akzeptiert ein Argument des zeigen -Datentyp, und zeigt die Entfernung vom angegebenen Punkt zum 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;  

Die Ergebnisse zeigen die Ergebnisse von der DistanceFrom Methode für jede Zeile in der Tabelle: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  

Die DistanceFromXY Methode übernimmt die Punkte einzeln als Argumente: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  

Das Ergebnis ist identisch mit der DistanceFrom Methode.The result set is the same as the DistanceFrom method.

Aktualisieren von Daten in einer UDT-SpalteUpdating Data in a UDT Column

Verwenden Sie die Transact-SQLTransact-SQL-UPDATE-Anweisung, um Daten in einer UDT-Spalte zu aktualisieren.To update data in a UDT column, use the Transact-SQLTransact-SQL UPDATE statement. Sie können auch eine Methode des UDTs verwenden, um den Status des Objekts zu aktualisieren.You can also use a method of the UDT to update the state of the object. Die folgende Transact-SQLTransact-SQL-Anweisung aktualisiert eine einzelne Zeile in der Tabelle: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  

Sie können auch UDT-Elemente getrennt aktualisieren.You can also update UDT elements separately. Die folgende Transact-SQLTransact-SQL-Anweisung aktualisiert nur die Y-Koordinate:The following Transact-SQLTransact-SQL statement updates only the Y coordinate:

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

Wenn der UDT mit Bytereihenfolge auf definiert wurde "true" , Transact-SQLTransact-SQL können die UDT-Spalte in einer WHERE-Klausel auswerten.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';  

Einschränkungen für UpdatesUpdating Limitations

Mehrere Eigenschaften können mit Transact-SQLTransact-SQL nicht gleichzeitig aktualisiert werden.You cannot update multiple properties at once using Transact-SQLTransact-SQL. Beispielsweise schlägt die folgende UPDATE-Anweisung fehl, und es wird ein Fehler ausgegeben, da Sie denselben Spaltennamen nicht zwei Mal in derselben UPDATE-Anweisung verwenden können.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  

Um jeden Punkt einzeln zu aktualisieren, müssen Sie in der Point-UDT-Assembly eine Mutatormethode erstellen.To update each point individually, you would need to create a mutator method in the Point UDT assembly. Anschließend können Sie die Mutatormethode aufrufen, um das Objekt in einer Transact-SQLTransact-SQL-UPDATE-Anweisung zu aktualisieren, wie im Folgenden dargestellt: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  

Löschen von Daten in einer UDT-SpalteDeleting Data in a UDT Column

Um Daten in einem UDT zu löschen, verwenden Sie die Transact-SQLTransact-SQL-DELETE-Anweisung.To delete data in a UDT, use the Transact-SQLTransact-SQL DELETE statement. Die folgende Anweisung löscht alle Zeilen in der Tabelle, die den in der WHERE-Klausel angegebenen Kriterien entsprechen.The following statement deletes all rows in the table that match the criteria specified in the WHERE clause. Wenn Sie die WHERE-Klausel einer DELETE-Anweisung weglassen, werden alle Zeilen in der Tabelle gelöscht.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)  

Sollen die Werte aus einer UDT-Spalte gelöscht werden, andere Zeilenwerte jedoch intakt bleiben, verwenden Sie die UPDATE-Anweisung.Use the UPDATE statement if you want to remove the values in a UDT column while leaving other row values intact. In diesem Beispiel wird für PointValue NULL festgelegt.This example sets the PointValue to null.

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

Siehe auchSee Also

Arbeiten mit benutzerdefinierten Typen in SQL ServerWorking with User-Defined Types in SQL Server