Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Transact-SQL não fornece sintaxe especializada para instruções INSERT
, UPDATE
ou 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 PointValue
correspondente.
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
, DistanceFrom
e 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;