Partilhar via


sql_variant (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

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

Transact-SQL convenções de sintaxe

Syntax

sql_variant  

Remarks

sql_variant pode ser usado em colunas, parâmetros, variáveis e os valores de retorno de funções definidas pelo usuário. sql_variant permite que esses objetos de banco de dados ofereçam suporte a valores de outros tipos de dados.

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

sql_variant pode ter um comprimento máximo de 8016 bytes. Isso inclui as informações do tipo base e o valor do tipo base. O comprimento máximo do valor real do tipo base é de 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.

sql_variant pode ser atribuído um valor padrão. Esse tipo de dados também pode ter NULL como seu valor subjacente, mas os valores NULL não terão um tipo de base associado. Além disso, sql_variant não pode ter outro sql_variant como seu tipo base.

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

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

sql_variant não pode ser usado em CONTAINSTABLE e FREETEXTTABLE.

ODBC não suporta totalmente sql_variant. Portanto, consultas de colunas de sql_variant são retornadas como dados binários quando você usa o Microsoft OLE DB Provider for ODBC (MSDASQL). Por exemplo, uma coluna sql_variant que contém os dados da cadeia de caracteres 'PS2091' é retornada como 0x505332303931.

Comparando sql_variant valores

O tipo de dados sql_variant pertence à parte superior da lista de hierarquia de tipos de dados para conversão. Para comparações 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 Binary
binary Binary
uniqueidentifier Uniqueidentifier

As seguintes regras aplicam-se às comparações sql_variant:

  • Quando sql_variant valores de diferentes tipos de dados de base são comparados e os tipos de dados de base estão em famílias de tipos de dados diferentes, o valor cuja família de tipos de dados é maior no gráfico de hierarquia é considerado o maior dos dois valores.
  • Quando sql_variant valores de diferentes tipos de dados de base são comparados e os tipos de dados de base estão na mesma família de tipos de dados, o valor cujo tipo de dados base é menor no gráfico de hierarquia é implicitamente convertido para o outro tipo de dados e a comparação é então feita.
  • Quando sql_variant valores dos tipos de dados char, varchar, ncharou nvarchar são comparados, seus agrupamentos são primeiro comparados com base nos seguintes critérios: LCID, versão LCID, sinalizadores de comparação e ID de classificação. Cada um desses critérios é comparado como valores inteiros e na ordem listada. Se todos esses critérios forem iguais, os valores reais da cadeia de caracteres serão comparados de acordo com o agrupamento.

Convertendo dados sql_variant

Ao manipular o tipo de dados sql_variant, o SQL Server oferece suporte a conversões implícitas de objetos com outros tipos de dados para o tipo sql_variant. No entanto, o SQL Server não oferece suporte a conversões implícitas de sql_variant dados para um objeto com outro tipo de dados.

Restrictions

A seguir estão listados os tipos de valores que não podem ser armazenados usando sql_variant:

  • datetimeoffset1
  • geography
  • geometry
  • hierarchyid
  • image
  • ntext
  • nvarchar(max)
  • Rowversion (carimbo temporal)
  • text
  • varchar(max)
  • varbinary(max)
  • Tipos definidos pelo usuário
  • xml

1 SQL Server 2012 e superior não restringem datetimeoffset.

Examples

A. Usando um sql_variant em uma tabela

O exemplo a seguir cria uma tabela com um tipo de dados sql_variant. Em seguida, o exemplo recupera SQL_VARIANT_PROPERTY informações sobre o valor colA46279.1 onde colB =1689, dado que tableA tem 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  

Aqui está o conjunto de resultados. Observe que cada um desses três valores é um sql_variant.

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

B. Usando um sql_variant como variável

O exemplo a seguir cria uma variável usando o tipo de dados sql_variant e, em seguida, recupera SQL_VARIANT_PROPERTY informações 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');  

Consulte também

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