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 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 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 Updates
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