Trabalhar com tipos definidos pelo usuário –Manipular dados UDTWorking with User-Defined Types - Manipulating UDT Data

APLICA-SE A: simSQL Server nãoBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

O Transact-SQLTransact-SQL não fornece uma sintaxe especializada para instruções INSERT, UPDATE ou DELETE ao modificar dados nas colunas UDTs (tipos definidos pelo usuário).Transact-SQLTransact-SQL provides no specialized syntax for INSERT, UPDATE, or DELETE statements when modifying data in user-defined type (UDT) columns. As funções Transact-SQLTransact-SQL CAST ou CONVERT são usadas para converter tipos de dados nativos no tipo UDT.The Transact-SQLTransact-SQL CAST or CONVERT functions are used to cast native data types to the UDT type.

Inserindo dados em uma coluna UDTInserting Data in a UDT Column

O seguinte Transact-SQLTransact-SQL instruções inserirem três linhas de dados de exemplo para o pontos tabela.The following Transact-SQLTransact-SQL statements insert three rows of sample data into the Points table. O ponto tipo de dados consiste em X e Y inteiro valores que são expostas como propriedades do UDT.The Point data type consists of X and Y integer values that are exposed as properties of the UDT. Você deve usar a função CAST ou CONVERT para converter o delimitada por vírgulas para valores de X e Y para o ponto tipo.You must use either the CAST or CONVERT function to cast the comma-delimited X and Y values to the Point type. As duas primeiras instruções usam a função CONVERT para converter um valor de cadeia de caracteres para o ponto tipo e a terceira instrução usa a função CAST:The first two statements use the CONVERT function to convert a string value to the Point type, and the third statement uses the CAST function:

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

Selecionando dadosSelecting Data

A instrução SELECT a seguir seleciona o valor binário do UDT.The following SELECT statement selects the binary value of the UDT.

SELECT ID, PointValue FROM dbo.Points  

Para ver a saída exibida em um formato legível, chame o ToString método o ponto UDT, que converte o valor em sua representação de cadeia de caracteres.To see the output displayed in a readable format, call the ToString method of the Point UDT, which converts the value to its string representation.

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

Isso gera os resultados a seguir.This produces the following results.

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

Você também pode usar as funções Transact-SQLTransact-SQL CAST e CONVERT para obter os mesmos resultados.You can also use the Transact-SQLTransact-SQL CAST and CONVERT functions to achieve the same results.

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

O ponto UDT expõe suas coordenadas X e Y como propriedades, que você pode selecionar individualmente.The Point UDT exposes its X and Y coordinates as properties, which you can then select individually. A seguinte instrução Transact-SQLTransact-SQL seleciona as coordenadas X e Y separadamente:The following Transact-SQLTransact-SQL statement selects the X and Y coordinates separately:

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

As propriedades X e Y retornam um valor inteiro, que é exibido no conjunto de resultados.The X and Y properties return an integer value, which is displayed in the result set.

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

Trabalhando com variáveisWorking with Variables

Você pode trabalhar com variáveis usam a instrução DECLARE para atribuir uma variável a um tipo UDT.You can work with variables using the DECLARE statement to assign a variable to a UDT type. As seguintes instruções atribuem um valor usando o Transact-SQLTransact-SQL instrução SET e exibem os resultados chamando o UDT ToString método na variável:The following statements assign a value using the Transact-SQLTransact-SQL SET statement and display the results by calling the UDT's ToString method on the variable:

DECLARE @PointValue Point;  
SET @PointValue = (SELECT PointValue FROM dbo.Points  
    WHERE ID = 2);  
SELECT @PointValue.ToString() AS PointValue;  

O conjunto de resultados exibe o valor da variável:The result set displays the variable value:

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

As seguintes instruções Transact-SQLTransact-SQL obtêm o mesmo resultado que usar SELECT em vez de SET para a atribuição de variável:The following Transact-SQLTransact-SQL statements achieve the same result using SELECT rather than SET for the variable assignment:

DECLARE @PointValue Point;  
SELECT @PointValue = PointValue FROM dbo.Points  
    WHERE ID = 2;  
SELECT @PointValue.ToString() AS PointValue;  

A diferença entre usar SELECT e SET para a atribuição de variável é que SELECT permite atribuir muitas variáveis a uma única instrução SELECT, ao passo que a sintaxe SET exige que cada atribuição de variável tenha sua própria instrução SET.The difference between using SELECT and SET for variable assignment is that SELECT allows you to assign multiple variables in one SELECT statement, whereas the SET syntax requires each variable assignment to have its own SET statement.

Comparando dadosComparing Data

Você pode usar operadores de comparação para comparar valores em seu UDT se você tiver definido o IsByteOrdered propriedade verdadeiro ao definir a classe.You can use comparison operators to compare values in your UDT if you have set the IsByteOrdered property to true when defining the class. Para obter mais informações, consulte criando um tipo definido pelo usuário.For more information, see Creating a User-Defined Type.

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

Você pode comparar valores internos do UDT independentemente do IsByteOrdered configuração se os próprios valores forem comparáveis.You can compare internal values of the UDT regardless of the IsByteOrdered setting if the values themselves are comparable. A seguinte instrução Transact-SQLTransact-SQL seleciona linhas onde X é maior que Y:The following Transact-SQLTransact-SQL statement selects rows where X is greater than Y:

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

Você também pode usar operadores de comparação com variáveis, como mostrado nesta consulta que procura um PointValue compatível.You can also use comparison operators with variables, as shown in this query that searches for a matching PointValue.

DECLARE @ComparePoint Point;  
SET @ComparePoint = CONVERT(Point, '3,4');  
SELECT ID, PointValue.ToString() AS MatchingPoint   
FROM dbo.Points  
WHERE PointValue = @ComparePoint;  

Invocando métodos UDTInvoking UDT Methods

Você também pode invocar métodos definidos em seu UDT no Transact-SQLTransact-SQL.You can also invoke methods that are defined in your UDT in Transact-SQLTransact-SQL. O ponto classe contém três métodos, distância, DistanceFrom, e DistanceFromXY.The Point class contains three methods, Distance, DistanceFrom, and DistanceFromXY. Para as listagens de código definem esses três métodos, consulte Codificando tipos.For the code listings defining these three methods, see Coding User-Defined Types.

O seguinte Transact-SQLTransact-SQL instrução chamadas a PointValue.Distance método:The following Transact-SQLTransact-SQL statement calls the PointValue.Distance method:

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

Os resultados são exibidos na distância coluna:The results are displayed in the Distance column:

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

O DistanceFrom método usa um argumento de aponte tipo de dados e exibe a distância do ponto especificado até o PointValue:The DistanceFrom method takes an argument of Point data type, and displays the distance from the specified point to the PointValue:

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

Os resultados exibem os resultados do DistanceFrom método para cada linha na tabela:The results display the results of the DistanceFrom method for each row in the table:

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

O DistanceFromXY método usa os pontos individualmente como argumentos:The DistanceFromXY method takes the points individually as arguments:

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

O conjunto de resultados é igual a DistanceFrom método.The result set is the same as the DistanceFrom method.

Atualizando dados em uma coluna UDTUpdating Data in a UDT Column

Para atualizar dados em uma coluna UDT, use a instrução Transact-SQLTransact-SQL UPDATE.To update data in a UDT column, use the Transact-SQLTransact-SQL UPDATE statement. Você também pode usar um método do UDT para atualizar o estado do objeto.You can also use a method of the UDT to update the state of the object. A seguinte instrução Transact-SQLTransact-SQL atualiza uma única linha na tabela:The following Transact-SQLTransact-SQL statement updates a single row in the table:

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

Você também pode atualizar elementos UDT separadamente.You can also update UDT elements separately. A seguinte instrução Transact-SQLTransact-SQL atualiza somente a coordenada Y:The following Transact-SQLTransact-SQL statement updates only the Y coordinate:

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

Se o UDT foi definido com a ordenação de bytes definida para verdadeira, Transact-SQLTransact-SQL pode avaliar a coluna UDT em uma cláusula WHERE.If the UDT has been defined with byte ordering set to true, Transact-SQLTransact-SQL can evaluate the UDT column in a WHERE clause.

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

Atualizando limitaçõesUpdating Limitations

Você não pode atualizar várias propriedades de uma ver usando Transact-SQLTransact-SQL.You cannot update multiple properties at once using Transact-SQLTransact-SQL. Por exemplo, a instrução UPDATE a seguir apresenta uma falha porque você não pode usar o mesmo nome de coluna duas vezes em uma única instrução UDATE.For example, the following UPDATE statement fails with an error because you cannot use the same column name twice in one UDATE statement.

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

Para atualizar cada ponto individualmente, você precisaria criar um método modificador no assembly UDT Point.To update each point individually, you would need to create a mutator method in the Point UDT assembly. Você pode invocar o método modificador para atualizar o objeto em uma instrução Transact-SQLTransact-SQL UPDATE, da seguinte maneira:You can then invoke the mutator method to update the object in a Transact-SQLTransact-SQL UPDATE statement, as in the following:

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

Excluindo dados em uma coluna UDTDeleting Data in a UDT Column

Para excluir dados em um UDT, use a instrução Transact-SQLTransact-SQL DELETE.To delete data in a UDT, use the Transact-SQLTransact-SQL DELETE statement. A instrução a seguir exclui todas as linhas da tabela que correspondem aos critérios especificadas na cláusula WHERE.The following statement deletes all rows in the table that match the criteria specified in the WHERE clause. Se você omitir a cláusula WHERE em uma instrução DELETE, todas as linhas da tabela serão excluídas.If you omit the WHERE clause in a DELETE statement, all rows in the table will be deleted.

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

Use a instrução UPDATE se quiser remover os valores em uma coluna UDT e deixar os valores de outras linhas intactos.Use the UPDATE statement if you want to remove the values in a UDT column while leaving other row values intact. Este exemplo define PointValue como nulo.This example sets the PointValue to null.

UPDATE dbo.Points  
SET PointValue = null  
WHERE ID = 2  

Consulte tambémSee Also

Trabalhando com tipos de dados definidos pelo usuário no SQL ServerWorking with User-Defined Types in SQL Server