Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

OBJECTPROPERTY() vs OBJECTPROPERTYEX() in SQL Server:qual è la differenza?

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
  • Tipo Base
  • È preciso
  • Accesso ai dati di sistema
  • TableFullTextSemanticExtraction
  • Accesso ai dati utente
  • Cardinalità
Proprietà supportate
  • CnstIsClustKey
  • CnstIsColumn
  • CnstIsDeleteCascade
  • CnstIsDisabled
  • CnstIsNonclustKey
  • CnstIsNotRepl
  • CnstIsNotTrusted
  • CnstIsUpdateCascade
  • ExecIsAfterTrigger
  • ExecIsAnsiNullsOn
  • ExecIsDeleteTrigger
  • ExecIsFirstDeleteTrigger
  • ExecIsFirstInsertTrigger
  • ExecIsFirstUpdateTrigger
  • ExecIsInsertTrigger
  • ExecIsInsteadOfTrigger
  • ExecIsLastDeleteTrigger
  • ExecIsLastInsertTrigger
  • ExecIsLastUpdateTrigger
  • ExecIsQuotedIdentOn
  • ExecIsStartup
  • ExecIsTriggerDisabled
  • ExecIsTriggerNotForRepl
  • ExecIsUpdateTrigger
  • ExecIsWithNativeCompilation
  • HasAfterTrigger
  • HaDeleteTrigger
  • HasInsertTrigger
  • HasInsteadOfTrigger
  • Ha UpdateTrigger
  • IsAnsiNullsOn
  • IsCheckCnst
  • È un vincolo
  • È predefinito
  • IsDefaultCnst
  • È deterministico
  • È crittografato
  • Eseguito
  • IsExtendedProc
  • ÈForeignKey
  • È indicizzato
  • È indicizzabile
  • Funzione IsInline
  • È spedito
  • È la chiave primaria
  • È una procedura
  • IsQuotedIdentOn
  • È in coda
  • IsReplProc
  • È la regola
  • Funzione IsScalar
  • IsSchemaBound
  • IsSystemTable
  • IsSystemVerified
  • È la tabella
  • Funzione IsTable
  • È Trigger
  • IsUniqueCnst
  • IsUserTable
  • IsView
  • ID proprietario
  • SchemaId
  • TableDeleteTrigger
  • TableDeleteTriggerCount
  • TableFullTextMergeStatus
  • TableFullTextBackgroundUpdateIndexOn
  • TableFulltextCatalogId
  • TableFulltextChangeTrackingOn
  • TableFulltextDocsProcessed
  • TableFulltextFailCount
  • TableFulltextItemCount
  • TableFulltextKeyColumn
  • TableFulltextPendingChanges
  • TableFulltextPopulateStatus
  • TableHasActiveFulltextIndex
  • TableHasCheckCnst
  • TableHasClustIndex
  • TableHasDefaultCnst
  • TableHasDeleteTrigger
  • TableHasForeignKey
  • TableHasForeignRef
  • TableHasIdentity
  • TableHasIndex
  • TableHasInsertTrigger
  • TableHasNonclustIndex
  • TableHasPrimaryKey
  • TableHasRowGuidCol
  • TableHasTextImage
  • TableHasTimestamp
  • TableHasUniqueCnst
  • TableHasUpdateTrigger
  • TableHasVarDecimalStorageFormat
  • TableInsertTrigger
  • TableInsertTriggerCount
  • TableIsFake
  • TableIsLockedOnBulkLoad
  • TableIsMemoryOptimized
  • TableIsPinned
  • TableTextInRowLimit
  • TableUpdateTrigger
  • TableUpdateTriggerCount
  • TableHasColumnSet
  • TipoTableTemporal
  • Tipo Base
  • CnstIsClustKey
  • CnstIsColumn
  • CnstIsDeleteCascade
  • CnstIsDisabled
  • CnstIsNonclustKey
  • CnstIsNotRepl
  • CnstIsNotTrusted
  • CnstIsUpdateCascade
  • ExecIsAfterTrigger
  • ExecIsAnsiNullsOn
  • ExecIsDeleteTrigger
  • ExecIsFirstDeleteTrigger
  • ExecIsFirstInsertTrigger
  • ExecIsFirstUpdateTrigger
  • ExecIsInsertTrigger
  • ExecIsInsteadOfTrigger
  • ExecIsLastDeleteTrigger
  • ExecIsLastInsertTrigger
  • ExecIsLastUpdateTrigger
  • ExecIsQuotedIdentOn
  • ExecIsStartup
  • ExecIsTriggerDisabled
  • ExecIsTriggerNotForRepl
  • ExecIsUpdateTrigger
  • ExecIsWithNativeCompilation
  • HasAfterTrigger
  • HaDeleteTrigger
  • HasInsertTrigger
  • HasInsteadOfTrigger
  • Ha UpdateTrigger
  • IsAnsiNullsOn
  • IsCheckCnst
  • È un vincolo
  • È predefinito
  • IsDefaultCnst
  • È deterministico
  • È crittografato
  • Eseguito
  • IsExtendedProc
  • ÈForeignKey
  • È indicizzato
  • È indicizzabile
  • Funzione IsInline
  • È spedito
  • È Preciso
  • È la chiave primaria
  • È una procedura
  • IsQuotedIdentOn
  • È in coda
  • IsReplProc
  • È la regola
  • Funzione IsScalar
  • IsSchemaBound
  • IsSystemTable
  • IsSystemVerified
  • È la tabella
  • Funzione IsTable
  • È Trigger
  • IsUniqueCnst
  • IsUserTable
  • IsView
  • ID proprietario
  • SchemaId
  • Accesso ai dati di sistema
  • TableDeleteTrigger
  • TableDeleteTriggerCount
  • TableFullTextMergeStatus
  • TableFullTextBackgroundUpdateIndexOn
  • TableFulltextCatalogId
  • TableFullTextChangeTrackingOn
  • TableFulltextDocsProcessed
  • TableFulltextFailCount
  • TableFulltextItemCount
  • TableFulltextKeyColumn
  • TableFulltextPendingChanges
  • TableFulltextPopulateStatus
  • TableFullTextSemanticExtraction
  • TableHasActiveFulltextIndex
  • TableHasCheckCnst
  • TableHasClustIndex
  • TableHasDefaultCnst
  • TableHasDeleteTrigger
  • TableHasForeignKey
  • TableHasForeignRef
  • TableHasIdentity
  • TableHasIndex
  • TableHasInsertTrigger
  • TableHasNonclustIndex
  • TableHasPrimaryKey
  • TableHasRowGuidCol
  • TableHasTextImage
  • TableHasTimestamp
  • TableHasUniqueCnst
  • TableHasUpdateTrigger
  • TableHasVarDecimalStorageFormat
  • TableInsertTrigger
  • TableInsertTriggerCount
  • TableIsFake
  • TableIsLockedOnBulkLoad
  • TableIsMemoryOptimized
  • TableIsPinned
  • TableTextInRowLimit
  • TableUpdateTrigger
  • TableUpdateTriggerCount
  • Accesso ai dati utente
  • TableHasColumnSet
  • Cardinalità
  • TipoTableTemporal

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.