Share via


Bearbeiten von UDT-Daten

Transact-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. Die Transact-SQL-Funktionen CAST oder CONVERT werden verwendet, um systemeigene Datentypen in den benutzerdefinierten Typ (UDT) umzuwandeln.

Einfügen von Daten in eine UDT-Spalte

Die folgenden Transact-SQL-Anweisungen fügen drei Zeilen Beispieldaten in die Tabelle Points ein. Der Point-Datentyp besteht aus X- und Y-Ganzzahlwerten, die als Eigenschaften des benutzerdefinierten Typs verfügbar gemacht werden. Verwenden Sie entweder die CAST-Funktion oder die CONVERT-Funktion, um die durch Kommas getrennten X- und Y-Werte in den Point-Typ umzuwandeln. Die ersten beiden Anweisungen verwenden die CONVERT-Funktion, um einen Zeichenfolgenwert in den Point-Typ zu konvertieren. 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 des Point-UDTs auf, welche den Wert in seine Zeichenfolgendarstellung konvertiert.

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

Hierdurch werden folgende Ergebnisse erzielt.

IDPointValue
----------
13,4
21,5
31,99

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

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

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

Der Point-UDT macht seine 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 die Y-Koordinate getrennt 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.

IDxValyVal
----------
134
215
3199

Arbeiten mit Variablen

Sie können mit Variablen arbeiten, indem Sie die DECLARE-Anweisung verwenden, um einem UDT eine Variable zuzuweisen. In den folgenden Anweisungen werden mithilfe der Transact-SQL-SET-Anweisung einem UDT ein Wert zugewiesen und durch den Aufruf der ToString-Methode des UDTs für die Variable die Ergebnisse angezeigt:

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

Mit den folgenden Transact-SQL-Anweisungen wird dasselbe Ergebnis erzielt. Dabei wird für die Variablenzuweisung SELECT statt SET verwendet:

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

Mithilfe von Vergleichoperatoren können Sie Werte in Ihrem UDT vergleichen, wenn Sie beim Definieren der Klasse für die IsByteOrdered-Eigenschaft true festlegen. Weitere Informationen finden Sie unter Erstellen eines benutzerdefinierten Typs.

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

Unabhängig von der IsByteOrdered-Einstellung können Sie interne Werte des UDTs vergleichen, wenn die Werte selbst vergleichbar sind. Die folgende Transact-SQL-Anweisung wählt die Zeilen aus, in denen X größer ist als 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 Anfrage 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 im 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 Programmieren benutzerdefinierter 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 Distance-Spalte angezeigt:

IDXYDistance
------------------------
1345
2155.09901951359278
319999.0050503762308

Die DistanceFrom-Methode übernimmt ein Argument vom Point-Datentyp und zeigt die Entfernung vom angegebenen Punkt zum PointValue:

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

Es werden die Ergebnisse der DistanceFrom-Methode für jede Zeile in der Tabelle angezeigt:

ID PntDistanceFromPoint
---------------------
13,495.0210502993942
21,594
31,990

Die DistanceFromXY-Methode übernimmt 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 mit dem der DistanceFrom-Methode identisch.

Aktualisieren von Daten in einer UDT-Spalte

Verwenden Sie die Transact-SQL-UPDATE-Anweisung, um Daten in einer UDT-Spalte zu aktualisieren. 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 der UDT so definiert wurde, dass für die Bytesortierung true festgelegt 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 Aktualisierungen

Mehrere Eigenschaften können mit Transact-SQL nicht gleichzeitig aktualisiert werden. 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.

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 zu aktualisieren, wie im Folgenden dargestellt:

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

Löschen von Daten in einer UDT-Spalte

Um Daten in einem 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