No SQL Server, você pode ter encontrado o
OBJECTPROPERTY()
função, apenas para descobrir que também existe um OBJECTPROPERTYEX()
função que parece fazer exatamente a mesma coisa. O que está acontecendo aqui? Por que a necessidade de duas funções que fazem a mesma coisa?
Meu entendimento é que a Microsoft escolheu adicionar
OBJECTPROPERTYEX()
para estender a funcionalidade de OBJECTPROPERTY()
, em vez de introduzir alterações em OBJECTPROPERTY()
que potencialmente quebraria o código existente em sistemas legados. Portanto, existem algumas diferenças entre as duas funções.
O que é diferente?
Em poucas palavras,
OBJECTPROPERTYEX()
suporta seis propriedades extras e seu tipo de retorno é diferente. Aqui está um colapso.
OBJECTPROPERTY() | OBJECTPROPERTYEX() | |
---|---|---|
Tipo de retorno | int | sql_variant |
Número de propriedades compatíveis | 103 | 109 |
Propriedades extras |
| |
Propriedades compatíveis |
|
|
Exemplo das propriedades extras
Aqui está um exemplo que mostra essas propriedades extras em uso.
USE WideWorldImportersDW; DECLARE @objectId int = OBJECT_ID(N'Integration.GenerateDateDimensionColumns'); SELECT OBJECTPROPERTYEX(@objectId, 'BaseType') AS BaseType, OBJECTPROPERTYEX(@objectId, 'IsPrecise') AS IsPrecise, OBJECTPROPERTYEX(@objectId, 'SystemDataAccess') AS SystemDataAccess, OBJECTPROPERTYEX(@objectId, 'TableFullTextSemanticExtraction') AS TableFullTextSemanticExtraction, OBJECTPROPERTYEX(@objectId, 'UserDataAccess') AS UserDataAccess, OBJECTPROPERTYEX(@objectId, 'Cardinality') AS Cardinality;
Resultado (usando saída vertical):
BaseType | IF IsPrecise | 0 SystemDataAccess | 1 TableFullTextSemanticExtraction | 0 UserDataAccess | 1 Cardinality | NULL
Nesse caso, o objeto é uma função com valor de tabela e retorna dados para cinco das seis propriedades.
Agora vamos passar o nome de uma tabela para ver se podemos obter um valor para a cardinalidade.
USE WideWorldImportersDW; DECLARE @objectId int = OBJECT_ID(N'Dimension.City'); SELECT OBJECTPROPERTYEX(@objectId, 'BaseType') AS BaseType, OBJECTPROPERTYEX(@objectId, 'IsPrecise') AS IsPrecise, OBJECTPROPERTYEX(@objectId, 'SystemDataAccess') AS SystemDataAccess, OBJECTPROPERTYEX(@objectId, 'TableFullTextSemanticExtraction') AS TableFullTextSemanticExtraction, OBJECTPROPERTYEX(@objectId, 'UserDataAccess') AS UserDataAccess, OBJECTPROPERTYEX(@objectId, 'Cardinality') AS Cardinality;
Resultado (usando saída vertical):
BaseType | U IsPrecise | NULL SystemDataAccess | NULL TableFullTextSemanticExtraction | 0 UserDataAccess | NULL Cardinality | 116295
Desta vez obtemos NULL para três das propriedades, mas obtemos um valor para a propriedade Cardinality.