Dela via


Ändra användardefinierade typdata (UDT)

gäller för:SQL Server

Transact-SQL innehåller ingen särskild syntax för INSERT, UPDATEeller DELETE-instruktioner när du ändrar data i användardefinierade typkolumner (UDT). Funktionerna Transact-SQL CAST eller CONVERT används för att omvandla inbyggda datatyper till UDT-typen.

Infoga data i en UDT-kolumn

Följande Transact-SQL-instruktioner infogar tre rader med exempeldata i tabellen Points. Den Point datatypen består av X- och Y-heltalsvärden som exponeras som egenskaper för UDT. Du måste använda antingen funktionen CAST eller CONVERT för att omvandla kommaavgränsade X- och Y-värden till den Point typen. De första två uttrycken använder funktionen CONVERT för att konvertera ett strängvärde till den Point typen, och den tredje instruktionen använder funktionen 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älj data

Följande SELECT-instruktion väljer det binära värdet för UDT.

SELECT ID, PointValue
FROM dbo.Points;

Om du vill se utdata som visas i ett läsbart format anropar du metoden ToString för Point UDT, som konverterar värdet till dess strängrepresentation.

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

Här är resultatuppsättningen.

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

Du kan också använda funktionerna Transact-SQL CAST och CONVERT för att uppnå samma resultat.

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

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

Den Point UDT exponerar dess X- och Y-koordinater som egenskaper, som du sedan kan välja individuellt. Följande Transact-SQL-instruktion väljer X- och Y-koordinaterna separat:

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

Egenskaperna X och Y returnerar ett heltalsvärde som visas i resultatuppsättningen.

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

Arbeta med variabler

Du kan arbeta med variabler med hjälp av instruktionen DECLARE för att tilldela en variabel till en UDT-typ. Följande instruktioner tilldelar ett värde med hjälp av Transact-SQL SET-instruktionen och visar resultatet genom att anropa UDT:s ToString-metod för variabeln:

DECLARE @PointValue AS Point;

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

SELECT @PointValue.ToString() AS PointValue;

Resultatuppsättningen visar variabelvärdet:

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

Följande Transact-SQL-instruktioner uppnår samma resultat med hjälp av SELECT i stället för SET för variabeltilldelningen:

DECLARE @PointValue AS Point;

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

SELECT @PointValue.ToString() AS PointValue;

Skillnaden mellan att använda SELECT och SET för variabeltilldelning är att SELECT gör att du kan tilldela flera variabler i en SELECT-instruktion, medan SET syntaxen kräver att varje variabeltilldelning har sin egen SET-instruktion.

Jämföra data

Du kan använda jämförelseoperatorer för att jämföra värden i din UDT om du anger egenskapen IsByteOrdered till true när du definierar klassen. Mer information finns i Skapa användardefinierade typer.

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

Du kan jämföra interna värden för UDT oavsett inställningen IsByteOrdered om själva värdena är jämförbara. Följande Transact-SQL-instruktion väljer rader där X är större än Y:

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

Du kan också använda jämförelseoperatorer med variabler, som du ser i den här frågan som söker efter en matchande PointValue.

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

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

Anropa UDT-metoder

Du kan också anropa metoder som definieras i din UDT i Transact-SQL. Klassen Point innehåller tre metoder, Distance, DistanceFromoch DistanceFromXY. De kodlistor som definierar dessa tre metoder finns i Skapa användardefinierade typer med ADO.NET.

Följande Transact-SQL-instruktion anropar metoden PointValue.Distance:

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

Resultatet visas i kolumnen Distance:

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

Metoden DistanceFrom tar ett argument av Point datatyp och visar avståndet från den angivna punkten till PointValue:

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

Resultatet visar resultatet av metoden DistanceFrom för varje rad i tabellen:

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

Metoden DistanceFromXY tar punkterna individuellt som argument:

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

Resultatuppsättningen är samma som metoden DistanceFrom.

Uppdatera data i en UDT-kolumn

Om du vill uppdatera data i en UDT-kolumn använder du instruktionen Transact-SQL UPDATE. Du kan också använda en udt-metod för att uppdatera objektets tillstånd. Följande Transact-SQL-instruktion uppdaterar en enskild rad i tabellen:

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

Du kan också uppdatera UDT-element separat. Följande Transact-SQL-instruktion uppdaterar endast Y-koordinaten:

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

Om UDT definieras med byteordning inställd på truekan Transact-SQL utvärdera UDT-kolumnen i en WHERE-sats.

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

Uppdateringsbegränsningar

Du kan inte uppdatera flera egenskaper samtidigt med Hjälp av Transact-SQL. Följande UPDATE-instruktion misslyckas till exempel med ett fel eftersom du inte kan använda samma kolumnnamn två gånger i en UPDATE-instruktion.

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

Om du vill uppdatera varje punkt individuellt måste du skapa en mutatormetod i den Point UDT-sammansättningen. Du kan sedan anropa mutatormetoden för att uppdatera objektet i en Transact-SQL UPDATE-instruktion, som i följande exempel:

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

Ta bort data i en UDT-kolumn

Om du vill ta bort data i en UDT använder du instruktionen Transact-SQL DELETE. Följande instruktion tar bort alla rader i tabellen som matchar de villkor som anges i WHERE-satsen. Om du utelämnar WHERE-satsen i en DELETE-instruktion tas alla rader i tabellen bort.

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

Använd instruktionen UPDATE om du vill ta bort värdena i en UDT-kolumn samtidigt som andra radvärden lämnas intakta. I det här exemplet anges PointValue till null.

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