Dans SQL Server, vous avez peut-être rencontré le OBJECTPROPERTY()
fonction, seulement pour découvrir qu'il y a aussi un OBJECTPROPERTYEX()
fonction qui semble faire exactement la même chose.
Que se passe t-il ici? Pourquoi avoir besoin de deux fonctions qui font la même chose ?
Je crois comprendre que Microsoft a choisi d'ajouter OBJECTPROPERTYEX()
pour étendre les fonctionnalités de OBJECTPROPERTY()
, plutôt que d'introduire des modifications dans OBJECTPROPERTY()
qui casserait potentiellement le code existant sur les anciens systèmes.
Il y en a donc quelques différences entre les deux fonctions.
Qu'est-ce qui est différent ?
En un mot, OBJECTPROPERTYEX()
prend en charge six propriétés supplémentaires et son type de retour est différent.
Voici une ventilation.
OBJECTPROPERTY() | OBJECTPROPERTYEX() | |
---|---|---|
Type de retour | entier | sql_variant |
Nombre de propriétés prises en charge | 103 | 109 |
Propriétés supplémentaires |
| |
Propriétés prises en charge |
|
|
Exemple de propriétés supplémentaires
Voici un exemple qui montre ces propriétés supplémentaires en cours d'utilisation.
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;
Résultat (en utilisant la sortie verticale) :
BaseType | IF IsPrecise | 0 SystemDataAccess | 1 TableFullTextSemanticExtraction | 0 UserDataAccess | 1 Cardinality | NULL
Dans ce cas, l'objet est une fonction table et renvoie des données pour cinq des six propriétés.
Maintenant, passons plutôt le nom d'une table pour voir si nous pouvons obtenir une valeur pour la cardinalité.
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;
Résultat (en utilisant la sortie verticale) :
BaseType | U IsPrecise | NULL SystemDataAccess | NULL TableFullTextSemanticExtraction | 0 UserDataAccess | NULL Cardinality | 116295
Cette fois, nous obtenons NULL pour trois des propriétés, mais nous obtenons une valeur pour la propriété Cardinalité.