Teilen über


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

Arbeiten mit benutzerdefinierten Typen in SQL Server