In SQL Server, OBJECTPROPERTY()
La funzione restituisce informazioni sugli oggetti con ambito schema nel database corrente.
Questi oggetti con ambito schema sono quelli che puoi vedere eseguendo una query su sys.objects
vista del catalogo di sistema. Non può essere utilizzato per oggetti che non sono nell'ambito dello schema.
Puoi usare OBJECTPROPERTY()
per verificare se un oggetto è una tabella, una vista, una procedura memorizzata, ecc. Puoi anche usarlo per verificare se una tabella ha una chiave primaria, una chiave esterna, un riferimento a una chiave esterna, ecc.
Sintassi
La sintassi è semplice. La funzione accetta due argomenti:l'ID dell'oggetto e la proprietà che vuoi restituire.
OBJECTPROPERTY ( id , property )
Esempio 1 – Utilizzo di base
Ecco un esempio per dimostrare l'utilizzo di base di questa funzione.
SELECT OBJECTPROPERTY('885578193', 'IsTable') AS Result;
Risultato:
+----------+ | Result | |----------| | 1 | +----------+
In questo caso, c'è un oggetto con un ID 885578193
ed è un tavolo
So che è una tabella perché è il risultato di IsTable
la proprietà è 1
. Se l'oggetto non fosse una tabella, il risultato qui sarebbe 0
.
Esempio 2 – Assegnare un nome all'oggetto
Nell'esempio precedente, conoscevo l'ID dell'oggetto. Nella maggior parte dei casi probabilmente conoscerai solo il nome dell'oggetto, ma non il suo ID. In questi casi, puoi utilizzare OBJECT_ID()
funzione per ottenere l'ID dell'oggetto, in base al suo nome.
In questo modo:
SELECT OBJECTPROPERTY(OBJECT_ID(N'Artists'), 'IsTable') AS Result;
Risultato:
+----------+ | Result | |----------| | 1 | +----------+
Esempio 3 – Nome oggetto qualificato
Quando si chiama OBJECT_ID()
funzione, è anche possibile fornire un nome in due o tre parti (per includere il nome dello schema e il nome del database).
SELECT OBJECTPROPERTY(OBJECT_ID(N'Music.dbo.Artists'), 'IsTable') AS Result;
Risultato:
+----------+ | Result | |----------| | 1 | +----------+
Tuttavia, non lasciare che questo ti induca a pensare che OBJECTPROPERTY()
utilizzerà quel database. Non lo farà (a meno che non sia lo stesso del database corrente). Per quanto lo riguarda, sta semplicemente ricevendo un ID oggetto. Dimenticarlo potrebbe portare a un risultato fuorviante.
Ecco un esempio da dimostrare.
USE WideWorldImportersDW; SELECT OBJECT_ID(N'Music.dbo.Artists') AS [OBJECT_ID], OBJECT_NAME(OBJECT_ID(N'Music.dbo.Artists')) AS [OBJECT_NAME], OBJECTPROPERTY(OBJECT_ID(N'Music.dbo.Artists'), 'IsTable') AS [IsTable]; USE Music; SELECT OBJECT_ID(N'Music.dbo.Artists') AS [OBJECT_ID], OBJECT_NAME(OBJECT_ID(N'Music.dbo.Artists')) AS [OBJECT_NAME], OBJECTPROPERTY(OBJECT_ID(N'Music.dbo.Artists'), 'IsTable') AS [IsTable];
Risultato:
Changed database context to 'WideWorldImportersDW'. +-------------+---------------+-----------+ | OBJECT_ID | OBJECT_NAME | IsTable | |-------------+---------------+-----------| | 885578193 | CityKey | 0 | +-------------+---------------+-----------+ (1 row affected) Changed database context to 'Music'. +-------------+---------------+-----------+ | OBJECT_ID | OBJECT_NAME | IsTable | |-------------+---------------+-----------| | 885578193 | Artists | 1 | +-------------+---------------+-----------+ (1 row affected)
In questo esempio, due database diversi hanno un oggetto con lo stesso ID. Uno di questi è un tavolo e l'altro no. Quindi otteniamo un risultato negativo nella prima query e un positivo nella seconda.
Esempio 4 – Altre proprietà
Ecco un esempio che restituisce più proprietà.
USE WideWorldImportersDW; DECLARE @objectId int = OBJECT_ID(N'Dimension.City'); SELECT OBJECTPROPERTY(@objectId, 'OwnerId') AS OwnerId, OBJECTPROPERTY(@objectId, 'SchemaId') AS SchemaId, OBJECTPROPERTY(@objectId, 'IsTable') AS IsTable, OBJECTPROPERTY(@objectId, 'TableHasPrimaryKey') AS TableHasPrimaryKey, OBJECTPROPERTY(@objectId, 'TableHasForeignKey') AS TableHasForeignKey, OBJECTPROPERTY(@objectId, 'TableHasForeignRef') AS TableHasForeignRef, OBJECTPROPERTY(@objectId, 'TableHasIdentity') AS TableHasIdentity;
Risultato (usando l'output verticale):
OwnerId | 1 SchemaId | 6 IsTable | 1 TableHasPrimaryKey | 1 TableHasForeignKey | 0 TableHasForeignRef | 1 TableHasIdentity | 0
Queste sono solo alcune delle 103 proprietà che puoi interrogare OBJECTPROPERTY()
per. Vedi sotto per un elenco completo.
Esempio 5 – In una clausola WHERE
Puoi usare OBJECTPROPERTY()
in un WHERE
clausola se richiesta.
In questo esempio, eseguo due query:una che restituisce tabelle che hanno una chiave esterna e una che restituisce tabelle a cui fa riferimento una chiave esterna.
USE WideWorldImporters; SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') = 1; SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasForeignRef') = 1;
Risultato:
Changed database context to 'WideWorldImporters'. +-------------+-----------------------+ | Schema | Table | |-------------+-----------------------| | Warehouse | Colors | | Sales | OrderLines | | Warehouse | PackageTypes | | Warehouse | StockGroups | | Warehouse | StockItemStockGroups | | Application | StateProvinces | | Sales | CustomerTransactions | | Application | Cities | | Application | SystemParameters | | Sales | InvoiceLines | | Purchasing | Suppliers | | Warehouse | StockItemTransactions | | Sales | Customers | | Purchasing | PurchaseOrders | | Sales | Orders | | Application | People | | Warehouse | StockItems | | Application | Countries | | Warehouse | StockItemHoldings | | Purchasing | PurchaseOrderLines | | Application | DeliveryMethods | | Application | PaymentMethods | | Purchasing | SupplierTransactions | | Application | TransactionTypes | | Sales | SpecialDeals | | Purchasing | SupplierCategories | | Sales | BuyingGroups | | Sales | Invoices | | Sales | CustomerCategories | +-------------+-----------------------+ (29 rows affected) +-------------+--------------------+ | Schema | Table | |-------------+--------------------| | Warehouse | Colors | | Warehouse | PackageTypes | | Warehouse | StockGroups | | Application | StateProvinces | | Application | Cities | | Purchasing | Suppliers | | Sales | Customers | | Purchasing | PurchaseOrders | | Sales | Orders | | Application | People | | Warehouse | StockItems | | Application | Countries | | Application | DeliveryMethods | | Application | PaymentMethods | | Application | TransactionTypes | | Purchasing | SupplierCategories | | Sales | BuyingGroups | | Sales | Invoices | | Sales | CustomerCategories | +-------------+--------------------+ (19 rows affected)
Elenco completo delle proprietà
Ecco un elenco completo delle proprietà supportate da OBJECTPROPERTY()
:
- 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
Consulta la documentazione Microsoft per una spiegazione dettagliata di ciascuna proprietà.