Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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