Manipulace s uživatelsky definovanými daty typu (UDT)
platí pro:SQL Server
Transact-SQL neposkytuje žádnou specializovanou syntaxi pro INSERT
, UPDATE
ani 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
, DistanceFrom
a 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;