Sdílet prostřednictvím


Manipulace s uživatelsky definovanými daty typu (UDT)

platí pro:SQL Server

Transact-SQL neposkytuje žádnou specializovanou syntaxi pro INSERT, UPDATEani příkazy DELETE při úpravě dat ve sloupcích definovaném uživatelem (UDT). Funkce Transact-SQL CAST nebo CONVERT slouží k přetypování nativních datových typů na typ UDT.

Vložení dat do sloupce UDT

Následující příkazy Transact-SQL vloží do tabulky Points tři řádky ukázkových dat. Datový typ Point se skládá z celočíselné hodnoty X a Y, které jsou vystaveny jako vlastnosti UDT. K přetypování hodnot X a Y oddělených čárkami na typ Point je nutné použít funkci CAST nebo CONVERT. První dva příkazy používají funkci CONVERT k převodu řetězcové hodnoty na typ Point a třetí příkaz používá funkci 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));

Výběr dat

Následující příkaz SELECT vybere binární hodnotu UDT.

SELECT ID, PointValue
FROM dbo.Points;

Pokud chcete zobrazit výstup zobrazený ve čitelném formátu, zavolejte ToString metodu Point UDT, která převede hodnotu na řetězcové vyjádření.

SELECT ID, PointValue.ToString() AS PointValue
FROM dbo.Points;

Tady je sada výsledků.

ID PointValue
-- ----------
 1 3,4
 2 1,5
 3 1,99

K dosažení stejných výsledků můžete použít také Transact-SQL CAST a CONVERT funkce.

SELECT ID, CAST (PointValue AS VARCHAR)
FROM dbo.Points;

SELECT ID, CONVERT (VARCHAR, PointValue)
FROM dbo.Points;

UDT Point zveřejňuje souřadnice X a Y jako vlastnosti, které pak můžete vybrat jednotlivě. Následující příkaz Transact-SQL vybere souřadnice X a Y samostatně:

SELECT ID,
       PointValue.X AS xVal,
       PointValue.Y AS yVal
FROM dbo.Points;

Vlastnosti X a Y vrátí celočíselnou hodnotu, která se zobrazí v sadě výsledků.

ID xVal yVal
-- ---- ----
 1    3    4
 2    1    5
 3    1   99

Práce s proměnnými

S proměnnými můžete pracovat pomocí příkazu DECLARE a přiřadit proměnnou k typu UDT. Následující příkazy přiřazují hodnotu pomocí příkazu Transact-SQL SET a zobrazují výsledky voláním metody ToString UDT v proměnné:

DECLARE @PointValue AS Point;

SET @PointValue = (SELECT PointValue
                   FROM dbo.Points
                   WHERE ID = 2);

SELECT @PointValue.ToString() AS PointValue;

Sada výsledků zobrazí hodnotu proměnné:

PointValue
----------
-1,5

Následující příkazy Transact-SQL dosáhnout stejného výsledku pomocí SELECT místo SET pro přiřazení proměnné:

DECLARE @PointValue AS Point;

SELECT @PointValue = PointValue
FROM dbo.Points
WHERE ID = 2;

SELECT @PointValue.ToString() AS PointValue;

Rozdíl mezi použitím SELECT a SET pro přiřazení proměnné spočívá v tom, že SELECT umožňuje přiřadit více proměnných v jednom SELECT příkazu, zatímco syntaxe SET vyžaduje, aby každé přiřazení proměnné mělo vlastní SET příkaz.

Porovnání dat

Pomocí relačních operátorů můžete porovnat hodnoty v UDT, pokud při definování třídy nastavíte vlastnost IsByteOrdered na true. Další informace najdete v tématu Vytvoření uživatelem definovaných typů.

SELECT ID, PointValue.ToString() AS Points
FROM dbo.Points
WHERE PointValue > CONVERT (Point, '2,2');

Interní hodnoty UDT můžete porovnat bez ohledu na nastavení IsByteOrdered, pokud jsou hodnoty samotné srovnatelné. Následující příkaz Transact-SQL vybere řádky, ve kterých je X větší než Y:

SELECT ID, PointValue.ToString() AS PointValue
FROM dbo.Points
WHERE PointValue.X < PointValue.Y;

Můžete také použít relační operátory s proměnnými, jak je znázorněno v tomto dotazu, který hledá odpovídající PointValue.

DECLARE @ComparePoint AS Point;
SET @ComparePoint = CONVERT (Point, '3,4');

SELECT ID, PointValue.ToString() AS MatchingPoint
FROM dbo.Points
WHERE PointValue = @ComparePoint;

Vyvolání metod UDT

Můžete také vyvolat metody definované v UDT v Transact-SQL. Třída Point obsahuje tři metody, Distance, DistanceFroma DistanceFromXY. Seznam kódu definující tyto tři metody najdete v tématu Vytvoření uživatelem definovaných typů pomocí ADO.NET.

Následující příkaz Transact-SQL volá metodu PointValue.Distance:

SELECT ID,
       PointValue.X AS [Point.X],
       PointValue.Y AS [Point.Y],
       PointValue.Distance() AS DistanceFromZero
FROM dbo.Points;

Výsledky se zobrazí ve sloupci Distance:

ID X  Y  Distance
-- -- -- ----------------
 1  3  4                5
 2  1  5 5.09901951359278
 3  1 99 99.0050503762308

Metoda DistanceFrom přebírá argument Point datového typu a zobrazuje vzdálenost od zadaného bodu k PointValue:

SELECT ID,
       PointValue.ToString() AS Pnt,
       PointValue.DistanceFrom(CONVERT (Point, '1,99')) AS DistanceFromPoint
FROM dbo.Points;

Výsledky zobrazují výsledky metody DistanceFrom pro každý řádek v tabulce:

ID Pnt DistanceFromPoint
-- --- -----------------
 1 3,4  95.0210502993942
 2 1,5                94
 3 1,9                90

Metoda DistanceFromXY vezme body jednotlivě jako argumenty:

SELECT ID,
       PointValue.X AS X,
       PointValue.Y AS Y,
       PointValue.DistanceFromXY(1, 99) AS DistanceFromXY
FROM dbo.Points;

Sada výsledků je stejná jako metoda DistanceFrom.

Aktualizace dat ve sloupci UDT

Pokud chcete aktualizovat data ve sloupci UDT, použijte příkaz Transact-SQL UPDATE. Můžete také použít metodu UDT k aktualizaci stavu objektu. Následující příkaz Transact-SQL aktualizuje jeden řádek v tabulce:

UPDATE dbo.Points
SET PointValue = CAST ('1,88' AS Point)
WHERE ID = 3;

Prvky UDT můžete aktualizovat také samostatně. Následující příkaz Transact-SQL aktualizuje pouze souřadnici Y:

UPDATE dbo.Points
SET PointValue.Y = 99
WHERE ID = 3;

Pokud je UDT definován pomocí pořadí bajtů nastaveným na true, Transact-SQL může vyhodnotit sloupec UDT v klauzuli WHERE.

UPDATE dbo.Points
SET PointValue = '4,5'
WHERE PointValue = '3,4';

Omezení aktualizací

Pomocí jazyka Transact-SQL nelze aktualizovat více vlastností najednou. Například následující příkaz UPDATE selže s chybou, protože v jednom příkazu UPDATE nemůžete použít stejný název sloupce dvakrát.

UPDATE dbo.Points
SET PointValue.X = 5, PointValue.Y = 99
WHERE ID = 3;

Pokud chcete každý bod aktualizovat jednotlivě, musíte v sestavení Point UDT vytvořit metodu mutátoru. Potom můžete vyvolat metodu mutatoru pro aktualizaci objektu v příkazu Transact-SQL UPDATE, jak je znázorněno v následujícím příkladu:

UPDATE dbo.Points
SET PointValue.SetXY(5, 99)
WHERE ID = 3;

Odstranění dat ve sloupci UDT

Pokud chcete odstranit data v UDT, použijte příkaz Transact-SQL DELETE. Následující příkaz odstraní všechny řádky v tabulce, které odpovídají kritériím zadaným v klauzuli WHERE. Pokud v příkazu DELETE vynecháte klauzuli WHERE, odstraní se všechny řádky v tabulce.

DELETE dbo.Points
WHERE PointValue = CAST ('1,99' AS Point);

Příkaz UPDATE použijte, pokud chcete odebrat hodnoty ve sloupci UDT a ponechat ostatní hodnoty řádků nedotčené. Tento příklad nastaví PointValue na hodnotu null.

UPDATE dbo.Points
SET PointValue = NULL
WHERE ID = 2;