Partilhar via


sql_variant (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Um tipo de dados que armazena valores de vários tipos de dados com suporte do SQL Server.

Convenções de sintaxe de Transact-SQL

Sintaxe

sql_variant  

Comentários

sql_variant pode ser usado em colunas, parâmetros, variáveis e nos valores retornados de funções definidas pelo usuário. sql_variant permite que esses objetos de banco de dados sejam compatíveis com valores de outros tipos de dados.

Uma coluna do tipo sql_variant pode conter linhas de tipos de dados diferentes. Por exemplo, uma coluna definida como sql_variant pode armazenar valores int, binary e char.

sql_variant pode ter um comprimento máximo de 8016 bytes. Isso inclui as informações de tipo base e o valor de tipo base. O tamanho máximo do valor de tipo base atual é 8.000 bytes.

Um tipo de dados sql_variant deve primeiro ser convertido em seu valor de tipo de dados base antes de participar de operações como adição e subtração.

É possível atribuir um valor padrão a sql_variant. Esse tipo de dados pode também ter NULL como valor subjacente, mas os valores NULL não terão um tipo base associado. Além disso, sql_variant não pode ter outra sql_variant como seu tipo base.

Uma chave primária exclusiva ou chave estrangeira pode incluir colunas do tipo sql_variant, mas o tamanho total dos valores de dados que constituem a chave de uma linha específica não deve ser superior ao tamanho máximo de um índice. Esse é de 900 bytes.

Uma tabela pode ter qualquer número de colunas sql_variant.

Não é possível usar sql_variant em CONTAINSTABLE e FREETEXTTABLE.

ODBC não é totalmente compatível com sql_variant. Desse modo, as consultas de colunas sql_variant retornam como valores binários quando você usa o MSDASQL (Provedor Microsoft OLE DB para ODBC). Por exemplo, uma coluna sql_variant que contém os dados de cadeia de caracteres 'PS2091' retorna como 0x505332303931.

Comparando valores sql_variant

O tipo de dados sql_variant pertence ao topo da lista de hierarquia de tipo de dados para conversão. Para comparações de sql_variant, a ordem da hierarquia de tipos de dados do SQL Server é agrupada em famílias de tipos de dados.

Hierarquia de tipos de dados Família de tipos de dados
sql_variant sql_variant
datetime2 Data e hora
datetimeoffset Data e hora
datetime Data e hora
smalldatetime Data e hora
date Data e hora
time Data e hora
float Numérico aproximado
real Numérico aproximado
decimal Numérico exato
money Numérico exato
smallmoney Numérico exato
bigint Numérico exato
int Numérico exato
smallint Numérico exato
tinyint Numérico exato
bit Numérico exato
nvarchar Unicode
nchar Unicode
varchar Unicode
char Unicode
varbinary Binário
binary Binário
uniqueidentifier Uniqueidentifier

As seguintes regras se aplicam a comparações sql_variant:

  • Quando valores de sql_variant de diferentes tipos de dados base são comparados e os tipos de dados base estão em diferentes famílias de tipos de dados, o valor cuja família de tipo de dados aparece no topo do gráfico da hierarquia é considerado o mais alto dos dois valores.
  • Quando valores de sql_variant de diferentes tipos de dados base são comparados e os tipos de dados base estão na mesma família de tipos de dados, o valor cujo tipo de dados base está na parte mais inferior do gráfico da hierarquia é convertido implicitamente no outro tipo de dados e a comparação é feita.
  • Quando valores sql_variant de char, varchar, nchar, ou nvarchar são de tipos de dados em comparação, suas ordenações são primeiro comparadas com base nos seguintes critérios: LCID, versão do LCID, sinalizadores de comparação e ID de classificação. Todos esses critérios são comparados como valores de inteiro na ordem listada. Se todos esses critérios forem iguais, os valores reais da cadeia de caracteres serão comparados de acordo com a ordenação.

Convertendo dados sql_variant

Ao lidar com o tipo de dados sql_variant, SQL Server é compatível com conversões implícitas de objetos com outros tipos de dados para o tipo sql_variant. Entretanto, o SQL Server não dá suporte para conversões implícitas de dados sql_variant para um objeto com outro tipo de dados.

Restrições

Veja a seguir uma lista dos tipos de valores que não podem ser armazenados usando sql_variant:

  • datetimeoffset1
  • geografia
  • geometria
  • hierarchyid
  • imagem
  • ntext
  • nvarchar(max)
  • rowversion (timestamp)
  • text
  • varchar(max)
  • varbinary(max)
  • Tipos definidos pelo usuário
  • xml

1 O SQL Server 2012 e posterior não restringem datetimeoffset.

Exemplos

a. Usando uma sql_variant em uma tabela

O exemplo a seguir cria uma tabela com um tipo de dados sql_variant. Então o exemplo recupera informações SQL_VARIANT_PROPERTY sobre o valor de colA46279.1, em que colB =1689, supondo que tableA tenha colA do tipo sql_variant e colB.

CREATE TABLE tableA(colA sql_variant, colB INT)  
INSERT INTO tableA values ( CAST(46279.1 as decimal(8,2)), 1689)  
SELECT   SQL_VARIANT_PROPERTY(colA,'BaseType') AS 'Base Type',  
         SQL_VARIANT_PROPERTY(colA,'Precision') AS 'Precision',  
         SQL_VARIANT_PROPERTY(colA,'Scale') AS 'Scale'  
FROM      tableA  
WHERE     colB = 1689  

Veja a seguir o conjunto de resultados. Observe que cada um desses três valores é uma sql_variant.

Base Type    Precision    Scale  
---------    ---------    -----  
decimal      8           2  
  
(1 row(s) affected)  

B. Usando uma sql_variant como uma variável

O exemplo a seguir, cria uma variável usando o tipo de dados sql_variant e, em seguida, recupera informações SQL_VARIANT_PROPERTY sobre uma variável chamada @v1.

DECLARE @v1 sql_variant;  
SET @v1 = 'ABC';  
SELECT @v1;  
SELECT SQL_VARIANT_PROPERTY(@v1, 'BaseType');  
SELECT SQL_VARIANT_PROPERTY(@v1, 'MaxLength');  

Confira também

CAST e CONVERT (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)