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 beim Ändern von Daten in benutzerdefinierten Typspalten (UDT). Die Transact-SQL CAST- oder CONVERT-Funktionen werden verwendet, um systemeigene 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 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 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 des Point UDT auf, wodurch der Wert in seine Zeichenfolgendarstellung konvertiert wird.
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 CAST- und CONVERT-Funktionen verwenden, um dieselben 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 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 dasselbe Ergebnis mithilfe von SELECT anstelle von SET für die Variablezuweisung:
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 Ihrem UDT zu vergleichen, wenn Sie die IsByteOrdered-Eigenschaft beim Definieren der Klasse auf "true " festgelegt haben. Weitere Informationen finden Sie unter Erstellen eines benutzerdefinierten Typs.
SELECT ID, PointValue.ToString() AS Points
FROM dbo.Points
WHERE PointValue > CONVERT(Point, '2,2');
Sie können interne Werte der UDT unabhängig von der IsByteOrdered-Einstellung 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;
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 Ihrem 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 von benutzerdefinierten 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 verwendet 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 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 identisch mit der DistanceFrom-Methode .
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 der auf "true" festgelegten Bytereihenfolge 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 mehrere Eigenschaften nicht gleichzeitig mit Transact-SQL aktualisieren. Die folgende UPDATE-Anweisung schlägt z. B. 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
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 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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für