Bearbeiten von benutzerdefinierten Typdaten (USER-Defined Type, UDT)
Gilt für:SQL Server
Transact-SQL stellt keine spezielle Syntax für INSERT
, UPDATE
oder DELETE
Anweisungen zum Ändern von Daten in benutzerdefinierten Typspalten (UDT) bereit. Die funktionen Transact-SQL CAST
oder CONVERT
werden verwendet, um systemeigene Datentypen in den UDT-Typ zu umwandeln.
Einfügen von Daten in eine UDT-Spalte
Die folgenden Transact-SQL Anweisungen fügen drei Zeilen mit Beispieldaten in die Points
Tabelle ein. Der datentyp Point
besteht aus X- und Y-Ganzzahlwerten, die als Eigenschaften des UDT verfügbar gemacht werden. Sie müssen entweder die CAST
- oder CONVERT
-Funktion verwenden, um die durch Trennzeichen getrennten X- und Y-Werte in den Point
Typ zu umwandeln. Die ersten beiden Anweisungen verwenden die CONVERT
-Funktion, um einen Zeichenfolgenwert in den Point
Typ zu konvertieren, und die dritte Anweisung verwendet die funktion CAST
:
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 UDT aus.
SELECT ID, PointValue
FROM dbo.Points;
Um die Ausgabe in einem lesbaren Format anzuzeigen, rufen Sie die ToString
-Methode des Point
UDT auf, wodurch der Wert in seine Zeichenfolgendarstellung konvertiert wird.
SELECT ID, PointValue.ToString() AS PointValue
FROM dbo.Points;
Hier sehen Sie das Resultset.
ID PointValue
-- ----------
1 3,4
2 1,5
3 1,99
Sie können auch die funktionen Transact-SQL 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;
Das 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 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 mithilfe der DECLARE
-Anweisung eine Variable einem UDT-Typ zuweisen. 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 AS 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 dasselbe Ergebnis mithilfe von SELECT
anstelle von SET
für die variable Zuordnung:
DECLARE @PointValue AS Point;
SELECT @PointValue = PointValue
FROM dbo.Points
WHERE ID = 2;
SELECT @PointValue.ToString() AS PointValue;
Der Unterschied zwischen der Verwendung von SELECT
und SET
für die Zuweisung von Variablen besteht darin, dass SELECT
Ihnen das Zuweisen mehrerer Variablen in einer SELECT
Anweisung ermöglicht, während für die SET
Syntax jede Variable Zuweisung eine eigene SET
Anweisung benötigt.
Vergleichen von Daten
Sie können Vergleichsoperatoren verwenden, um Werte in Ihrem UDT zu vergleichen, wenn Sie die IsByteOrdered
-Eigenschaft beim Definieren der Klasse auf true
festlegen. Weitere Informationen finden Sie unter Erstellen benutzerdefinierter Typen.
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, wobei X größer als Y ist:
SELECT ID, PointValue.ToString() AS PointValue
FROM dbo.Points
WHERE PointValue.X < PointValue.Y;
Sie können auch Vergleichsoperatoren mit Variablen verwenden, wie in dieser Abfrage gezeigt, die nach einem übereinstimmenden PointValue
sucht.
DECLARE @ComparePoint AS 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 Ihrem UDT in Transact-SQL definiert sind. Die Point
-Klasse enthält drei Methoden, Distance
, DistanceFrom
und DistanceFromXY
. Informationen zu den Codeauflistungen, die diese drei Methoden definieren, finden Sie unter Erstellen benutzerdefinierter Typen mit ADO.NET.
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 Distance
angezeigt:
ID X Y Distance
-- -- -- ----------------
1 3 4 5
2 1 5 5.09901951359278
3 1 99 99.0050503762308
Die DistanceFrom
-Methode verwendet ein Argument 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 verwendet 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 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 das UDT mit bytereihenfolge auf true
festgelegt ist, kann Transact-SQL die UDT-Spalte in einer WHERE
-Klausel auswerten.
UPDATE dbo.Points
SET PointValue = '4,5'
WHERE PointValue = '3,4';
Updatebeschränkungen
Sie können mehrere Eigenschaften nicht gleichzeitig mithilfe von Transact-SQL aktualisieren. Die folgende UPDATE
-Anweisung schlägt beispielsweise 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 eine Mutatormethode in der Point
UDT-Assembly erstellen. Anschließend können Sie die Mutatormethode aufrufen, um das Objekt in einer Transact-SQL UPDATE
-Anweisung zu aktualisieren, wie im folgenden Beispiel gezeigt:
UPDATE dbo.Points
SET PointValue.SetXY(5, 99)
WHERE ID = 3;
Löschen von Daten in einer UDT-Spalte
Verwenden Sie die Transact-SQL DELETE
-Anweisung, um Daten in einem UDT zu löschen. Die folgende Anweisung löscht alle Zeilen in der Tabelle, die den in der WHERE
-Klausel angegebenen Kriterien entsprechen. Wenn Sie die WHERE
-Klausel in einer DELETE
-Anweisung weglassen, werden alle Zeilen in der Tabelle gelöscht.
DELETE dbo.Points
WHERE PointValue = CAST ('1,99' AS Point);
Verwenden Sie die UPDATE
-Anweisung, wenn Sie die Werte in einer UDT-Spalte entfernen möchten, während andere Zeilenwerte intakt bleiben. In diesem Beispiel wird die PointValue
auf NULL festgelegt.
UPDATE dbo.Points
SET PointValue = NULL
WHERE ID = 2;