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

Come funziona OBJECTPROPERTY() in SQL Server

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à.