sql_variant (Transact-SQL)
Um tipo de dados que armazena valores de vários tipos de dados suportados do SQL Server.
Sintaxe
sql_variant
Comentários
sql_variant pode ser usado em colunas, parâmetros, variáveis e valores de retorno de funções definidas pelo usuário. sql_variant permite que os objetos desse banco de dados aceitem 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 int, binarye valores char. A tabela a seguir lista os tipos de valores que não podem ser armazenados usando sql_variant:
varchar(max) |
varbinary(max) |
nvarchar(max) |
xml |
text |
ntext |
image |
rowversion (timestamp) |
sql_variant |
geography |
hierarchyid |
geometry |
Tipos definidos pelo usuário |
datetimeoffset |
sql_variant pode ter no 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 para 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 como um valor padrão. 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 outro sql_variant como 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.
sql_variant não pode ser usado em CONTAINSTABLE e FREETEXTTABLE.
ODBC não aceita sql_variantcompletamente. Desse modo, as consultas de colunassql_variant retornam como valores binários quando você usa o Microsoft OLE DB Provider para ODBC (MSDASQL). 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 regras a seguir 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 estiver na parte mais inferior do gráfico da hierarquia é convertido implicitamente no outro tipo de dados e a comparação é feita.
Quando valores de sql_variant dos tipos de dados char, varchar, nchar ou nvarchar são comparados, seus agrupamentos são primeiro comparados 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 o agrupamento.