Arbeiten mit benutzerdefinierten Typen: Bearbeiten von UDT-Daten

Gilt für:SQL Server

Transact-SQL bietet keine spezielle Syntax für INSERT-, UPDATE- oder DELETE-Anweisungen, wenn Daten in UDT-Spalten (User-Defined Type) geändert werden. Die Transact-SQL CAST- oder CONVERT-Funktionen werden verwendet, um native Datentypen in den UDT-Typ umzuwandeln.

Einfügen von Daten in eine UDT-Spalte

Die folgenden Transact-SQL-Anweisungen fügen drei Zeilen mit Beispieldaten in die Tabelle Points ein. Der Point-Datentyp besteht aus ganzzahligen X- und Y-Werten, die als Eigenschaften des UDT verfügbar gemacht werden. Sie müssen entweder die CAST- oder CONVERT-Funktion verwenden, um die durch Kommas getrennten X- und Y-Werte in den Punkttyp umzuwandeln. Die ersten beiden Anweisungen verwenden die CONVERT-Funktion, um einen Zeichenfolgenwert in den Point-Typ zu konvertieren, und die dritte Anweisung verwendet die CAST-Funktion:

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 Daten

Die folgende SELECT-Anweisung wählt den Binärwert des UDTs aus.

SELECT ID, PointValue FROM dbo.Points  

Um die Ausgabe in einem lesbaren Format anzuzeigen, rufen Sie die ToString-Methode der Point UDT auf, die den Wert in seine Zeichenfolgendarstellung konvertiert.

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

Hierdurch werden folgende Ergebnisse erzielt.

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

Sie können auch die Transact-SQL-Funktionen CAST und CONVERT verwenden, um die gleichen Ergebnisse zu erzielen.

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

Die Punkt-UDT macht ihre X- und Y-Koordinaten als Eigenschaften verfügbar, die Sie dann einzeln auswählen können. Die folgende Transact-SQL-Anweisung wählt die X- und Y-Koordinaten separat aus:

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.

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

Arbeiten mit Variablen

Sie können mit Variablen arbeiten, indem Sie die DECLARE-Anweisung verwenden, um einem UDT eine Variable zuzuweisen. Die folgenden Anweisungen weisen einen Wert mithilfe der Transact-SQL SET-Anweisung zu und zeigen die Ergebnisse an, indem die ToString-Methode der UDT für die Variable aufgerufen wird:

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:

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

Die folgenden Transact-SQL-Anweisungen erzielen das gleiche Ergebnis mithilfe von SELECT anstelle von SET für die Variablenzuweisung:

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.

Vergleichen von Daten

Sie können Vergleichsoperatoren verwenden, um Werte in Ihrer UDT zu vergleichen, wenn Sie die IsByteOrdered-Eigenschaft beim Definieren der Klasse auf true festgelegt haben. Weitere Informationen finden Sie unter Erstellen eines User-Defined-Typs.

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

Sie können interne Werte des UDT unabhängig von der Einstellung IsByteOrdered vergleichen, wenn die Werte selbst vergleichbar sind. Die folgende Transact-SQL-Anweisung wählt Zeilen aus, in denen X größer als Y ist:

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.

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

Aufrufen von UDT-Methoden

Sie können auch Methoden aufrufen, die in Ihrer UDT in Transact-SQL definiert sind. Die Point-Klasse enthält drei Methoden: Distance, DistanceFrom und DistanceFromXY. Die Codeauflistungen, die diese drei Methoden definieren, finden Sie unter Codieren User-Defined Typen.

Die folgende Transact-SQL-Anweisung ruft die PointValue.Distance-Methode auf:

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

Die Ergebnisse werden in der Spalte Abstand angezeigt:

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 Point-Datentyps und zeigt den Abstand vom angegebenen Punkt zum PointValue an:

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

Die Ergebnisse zeigen die Ergebnisse der DistanceFrom-Methode für jede Zeile in der Tabelle an:

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

Die DistanceFromXY-Methode akzeptiert die Punkte einzeln als Argumente:

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

Das Resultset ist identisch mit der DistanceFrom-Methode .

Aktualisieren von Daten in einer UDT-Spalte

Verwenden Sie zum Aktualisieren von Daten in einer UDT-Spalte die Transact-SQL UPDATE-Anweisung. Sie können auch eine Methode des UDTs verwenden, um den Status des Objekts zu aktualisieren. Die folgende Transact-SQL-Anweisung aktualisiert eine einzelne Zeile in der Tabelle:

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

Sie können auch UDT-Elemente getrennt aktualisieren. Die folgende Transact-SQL-Anweisung aktualisiert nur die Y-Koordinate:

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

Wenn die UDT mit bytereihenfolge auf true definiert wurde, kann Transact-SQL die UDT-Spalte in einer WHERE-Klausel auswerten.

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

Einschränkungen für Updates

Sie können nicht mehrere Eigenschaften gleichzeitig mit Transact-SQL aktualisieren. Beispielsweise schlägt die folgende UPDATE-Anweisung mit einem Fehler fehl, da Sie denselben Spaltennamen nicht zweimal in einer UPDATE-Anweisung verwenden können.

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. Anschließend können Sie die Mutatormethode aufrufen, um das Objekt in einer Transact-SQL UPDATE-Anweisung wie folgt zu aktualisieren:

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

Löschen von Daten in einer UDT-Spalte

Um Daten in einer UDT zu löschen, verwenden Sie die Transact-SQL DELETE-Anweisung. Die folgende Anweisung löscht alle Zeilen in der Tabelle, die den in der WHERE-Klausel angegebenen Kriterien entsprechen. Wenn Sie die WHERE-Klausel einer DELETE-Anweisung weglassen, werden alle Zeilen in der Tabelle gelöscht.

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. In diesem Beispiel wird für PointValue NULL festgelegt.

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

Weitere Informationen

Arbeiten mit benutzerdefinierten Typen in SQL Server