In SQL Server sind Sie vielleicht auf OBJECTPROPERTY()
gestoßen Funktion, nur um herauszufinden, dass es auch ein OBJECTPROPERTYEX()
gibt Funktion, die genau dasselbe zu tun scheint.
Was ist denn hier los? Warum die Notwendigkeit zweier Funktionen, die dasselbe tun?
Soweit ich weiß, hat Microsoft beschlossen, OBJECTPROPERTYEX()
hinzuzufügen um die Funktionalität von OBJECTPROPERTY()
zu erweitern , anstatt Änderungen an OBJECTPROPERTY()
einzuführen das würde möglicherweise vorhandenen Code auf Legacy-Systemen beschädigen.
Es gibt also einige Unterschiede zwischen den beiden Funktionen.
Was ist anders?
Kurz gesagt, OBJECTPROPERTYEX()
unterstützt sechs zusätzliche Eigenschaften, und sein Rückgabetyp ist anders.
Hier ist eine Aufschlüsselung.
OBJEKTEIGENSCHAFT() | OBJECTPROPERTYEX() | |
---|---|---|
Rückgabetyp | int | sql_variant |
Anzahl der unterstützten Eigenschaften | 103 | 109 |
Zusätzliche Eigenschaften |
| |
Unterstützte Eigenschaften |
|
|
Beispiel für die zusätzlichen Eigenschaften
Hier ist ein Beispiel, das diese zusätzlichen Eigenschaften in Verwendung zeigt.
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;
Ergebnis (bei vertikaler Ausgabe):
BaseType | IF IsPrecise | 0 SystemDataAccess | 1 TableFullTextSemanticExtraction | 0 UserDataAccess | 1 Cardinality | NULL
In diesem Fall ist das Objekt eine Tabellenwertfunktion und gibt Daten für fünf der sechs Eigenschaften zurück.
Lassen Sie uns jetzt stattdessen den Namen einer Tabelle übergeben, um zu sehen, ob wir einen Wert für die Kardinalität erhalten können.
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;
Ergebnis (bei vertikaler Ausgabe):
BaseType | U IsPrecise | NULL SystemDataAccess | NULL TableFullTextSemanticExtraction | 0 UserDataAccess | NULL Cardinality | 116295
Dieses Mal erhalten wir NULL für drei der Eigenschaften, aber wir erhalten einen Wert für die Kardinalitätseigenschaft.