In SQL Server potresti aver riscontrato OBJECTPROPERTY()
funzione, solo per scoprire che esiste anche un OBJECTPROPERTYEX()
funzione che sembra fare esattamente la stessa cosa.
Cosa sta succedendo qui? Perché la necessità di due funzioni che fanno la stessa cosa?
La mia comprensione è che Microsoft ha scelto di aggiungere OBJECTPROPERTYEX()
per estendere la funzionalità di OBJECTPROPERTY()
, piuttosto che introdurre modifiche a OBJECTPROPERTY()
ciò potrebbe potenzialmente violare il codice esistente sui sistemi legacy.
Quindi ce ne sono alcuni differenze tra le due funzioni.
Cosa c'è di diverso?
In poche parole, OBJECTPROPERTYEX()
supporta sei proprietà extra e il suo tipo restituito è diverso.
Ecco una ripartizione.
PROPRIETÀ DELL'OGGETTO() | OBJECTPROPERTYEX() | |
---|---|---|
Tipo di reso | int | variante_sql |
Numero di proprietà supportate | 103 | 109 |
Proprietà extra |
| |
Proprietà supportate |
|
|
Esempio di proprietà extra
Ecco un esempio che mostra queste proprietà extra in 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;
Risultato (usando l'output verticale):
BaseType | IF IsPrecise | 0 SystemDataAccess | 1 TableFullTextSemanticExtraction | 0 UserDataAccess | 1 Cardinality | NULL
In questo caso, l'oggetto è una funzione con valori di tabella e restituisce i dati per cinque delle sei proprietà.
Passiamo ora invece al nome di una tabella per vedere se possiamo ottenere un valore per 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;
Risultato (usando l'output verticale):
BaseType | U IsPrecise | NULL SystemDataAccess | NULL TableFullTextSemanticExtraction | 0 UserDataAccess | NULL Cardinality | 116295
Questa volta otteniamo NULL per tre delle proprietà, ma otteniamo un valore per la proprietà Cardinality.