Partilhar via


Manipular dados de tipo definido pelo usuário (UDT)

Aplica-se a:SQL Server

Transact-SQL não fornece sintaxe especializada para instruções INSERT, UPDATEou DELETE ao modificar dados em colunas UDT (tipo definido pelo usuário). As funções Transact-SQL CAST ou CONVERT são usadas para transmitir tipos de dados nativos para o tipo UDT.

Inserir dados numa coluna UDT

As instruções Transact-SQL a seguir inserem três linhas de dados de exemplo na tabela Points. O tipo de dados Point consiste em valores inteiros X e Y que são expostos como propriedades do UDT. Você deve usar a função CAST ou CONVERT para converter os valores X e Y delimitados por vírgulas para o tipo Point. As duas primeiras instruções usam a função CONVERT para converter um valor de cadeia de caracteres para o tipo Point, e a terceira instrução usa a função 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));

Selecionar dados

A instrução SELECT a seguir seleciona o valor binário do UDT.

SELECT ID, PointValue
FROM dbo.Points;

Para ver a saída exibida em um formato legível, chame o método ToString do Point UDT, que converte o valor em sua representação de cadeia de caracteres.

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

Aqui está o conjunto de resultados.

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

Você também pode usar as funções Transact-SQL CAST e CONVERT para obter os mesmos resultados.

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

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

O Point UDT expõe suas coordenadas X e Y como propriedades, que você pode selecionar individualmente. A instrução Transact-SQL a seguir seleciona as coordenadas X e Y separadamente:

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.

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

Trabalhar com variáveis

Você pode trabalhar com variáveis usando a instrução DECLARE para atribuir uma variável a um tipo UDT. As instruções a seguir atribuem um valor usando a instrução Transact-SQL SET e exibem os resultados chamando o método ToString da UDT na variável:

DECLARE @PointValue AS 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:

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

As seguintes instruções Transact-SQL obtêm o mesmo resultado usando SELECT em vez de SET para a atribuição variável:

DECLARE @PointValue AS Point;

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

SELECT @PointValue.ToString() AS PointValue;

A diferença entre usar SELECT e SET para atribuição de variáveis é que SELECT permite atribuir várias variáveis em uma instrução SELECT, enquanto a sintaxe SET exige que cada atribuição de variável tenha sua própria instrução SET.

Comparar dados

Você pode usar operadores de comparação para comparar valores em seu UDT se definir a propriedade IsByteOrdered como true ao definir a classe. Para obter mais informações, consulte Criar tipos definidos pelo usuário.

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

Você pode comparar valores internos do UDT independentemente da configuração IsByteOrdered se os próprios valores forem comparáveis. A instrução Transact-SQL a seguir seleciona linhas em que X é maior que 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, conforme mostrado nesta consulta que procura um PointValuecorrespondente.

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

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

Invocar métodos UDT

Você também pode invocar métodos definidos em seu UDT no Transact-SQL. A classe Point contém três métodos, Distance, DistanceFrome DistanceFromXY. Para obter as listagens de código que definem esses três métodos, consulte Criar tipos definidos pelo usuário com ADO.NET.

A instrução Transact-SQL a seguir chama o método PointValue.Distance:

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 coluna Distance:

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

O método DistanceFrom usa um argumento de Point tipo de dados e exibe a distância do ponto especificado para o PointValue:

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

Os resultados exibem os resultados do método DistanceFrom para cada linha da tabela:

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

O método DistanceFromXY toma os pontos individualmente como argumentos:

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

O conjunto de resultados é o mesmo que o método DistanceFrom.

Atualizar dados em uma coluna UDT

Para atualizar dados em uma coluna UDT, use a instrução Transact-SQL UPDATE. Você também pode usar um método do UDT para atualizar o estado do objeto. A instrução Transact-SQL a seguir atualiza uma única linha na tabela:

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

Você também pode atualizar os elementos UDT separadamente. A seguinte instrução Transact-SQL atualiza apenas a coordenada Y:

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

Se o UDT for definido com a ordem de bytes definida como true, Transact-SQL poderá avaliar a coluna UDT em uma cláusula WHERE.

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

Limitações de atualização

Não é possível atualizar várias propriedades de uma só vez usando o Transact-SQL. Por exemplo, a instrução UPDATE a seguir falha com um erro porque você não pode usar o mesmo nome de coluna duas vezes em uma instrução UPDATE.

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

Para atualizar cada ponto individualmente, você precisaria criar um método mutador no Point UDT assembly. Em seguida, você pode invocar o método mutator para atualizar o objeto em uma instrução Transact-SQL UPDATE, como no exemplo a seguir:

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

Excluir dados em uma coluna UDT

Para excluir dados em um UDT, use a instrução Transact-SQL DELETE. A instrução a seguir exclui todas as linhas da tabela que correspondem aos critérios especificados na cláusula WHERE. Se você omitir a cláusula WHERE em uma instrução DELETE, todas as linhas da tabela serão excluídas.

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

Use a instrução UPDATE se quiser remover os valores em uma coluna UDT deixando outros valores de linha intactos. Este exemplo define o PointValue como null.

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