Freigeben über


Bearbeiten von benutzerdefinierten Typdaten (USER-Defined Type, UDT)

Gilt für:SQL Server

Transact-SQL stellt keine spezielle Syntax für INSERT, UPDATEoder 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 PointValuesucht.

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, DistanceFromund 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 PointValuean:

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 truefestgelegt 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;