Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fonctionnement de OBJECTPROPERTY() dans SQL Server

Dans SQL Server, le OBJECTPROPERTY() La fonction renvoie des informations sur les objets de portée schéma dans la base de données actuelle.

Ces objets à portée de schéma sont ceux que vous pouvez voir en interrogeant sys.objects vue du catalogue système. Il ne peut pas être utilisé pour les objets qui ne sont pas limités au schéma.

Vous pouvez utiliser OBJECTPROPERTY() pour vérifier si un objet est une table, une vue, une procédure stockée, etc. Vous pouvez également l'utiliser pour vérifier si une table a une clé primaire, une clé étrangère, une référence de clé étrangère, etc.

Syntaxe

La syntaxe est simple. La fonction accepte deux arguments :l'ID de l'objet et la propriété que vous souhaitez renvoyer.

OBJECTPROPERTY ( id , property )

Exemple 1 - Utilisation de base

Voici un exemple pour illustrer l'utilisation de base de cette fonction.

SELECT OBJECTPROPERTY('885578193', 'IsTable') AS Result;

Résultat :

+----------+
| Result   |
|----------|
| 1        |
+----------+

Dans ce cas, il y a un objet avec un ID de 885578193 et c'est une table.

Je sais que c'est une table car le résultat de la commande IsTable la propriété est 1 . Si l'objet n'était pas une table, le résultat ici serait 0 .

Exemple 2 - Nommer l'objet

Dans l'exemple précédent, je connaissais l'ID de l'objet. Dans la plupart des cas, vous ne connaîtrez probablement que le nom de l'objet, mais pas son ID. Dans de tels cas, vous pouvez utiliser le OBJECT_ID() fonction pour obtenir l'ID de l'objet, en fonction de son nom.

Comme ceci :

SELECT OBJECTPROPERTY(OBJECT_ID(N'Artists'), 'IsTable') AS Result;

Résultat :

+----------+
| Result   |
|----------|
| 1        |
+----------+

Exemple 3 - Nom d'objet qualifié

Lors de l'appel de OBJECT_ID() fonction, vous pouvez également fournir un nom en deux ou trois parties (pour inclure le nom du schéma et le nom de la base de données).

SELECT OBJECTPROPERTY(OBJECT_ID(N'Music.dbo.Artists'), 'IsTable') AS Result;

Résultat :

+----------+
| Result   |
|----------|
| 1        |
+----------+

Cependant, ne laissez pas cela vous tromper en pensant que OBJECTPROPERTY() utilisera cette base de données. Ce ne sera pas le cas (à moins que ce ne soit la même que la base de données actuelle). En ce qui le concerne, il reçoit simplement un ID d'objet. Oublier cela pourrait conduire à un résultat trompeur.

Voici un exemple pour illustrer.

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];

Résultat :

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)

Dans cet exemple, deux bases de données différentes ont un objet avec le même ID. L'un d'eux est une table et l'autre non. Nous obtenons donc un résultat négatif à la première requête et positif à la seconde.

Exemple 4 - Plus de propriétés

Voici un exemple qui renvoie plus de propriétés.

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;

Résultat (en utilisant la sortie verticale) :

OwnerId            | 1
SchemaId           | 6
IsTable            | 1
TableHasPrimaryKey | 1
TableHasForeignKey | 0
TableHasForeignRef | 1
TableHasIdentity   | 0

Ce ne sont que quelques-unes des 103 propriétés que vous pouvez interroger OBJECTPROPERTY() pour. Voir ci-dessous pour une liste complète.

Exemple 5 – Dans une clause WHERE

Vous pouvez utiliser OBJECTPROPERTY() dans un WHERE clause si nécessaire.

Dans cet exemple, j'exécute deux requêtes :une qui renvoie les tables qui ont une clé étrangère et une qui renvoie les tables qui sont référencées par une clé étrangère.

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;

Résultat :

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)

Liste complète des propriétés

Voici une liste complète des propriétés prises en charge par 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
  • HasDeleteTrigger
  • HasInsertTrigger
  • HasInsteadOfTrigger
  • HasUpdateTrigger
  • EstAnsiNullsOn
  • IsCheckCnst
  • IsConstraint
  • EstParDéfaut
  • IsDefaultCnst
  • Est déterministe
  • IsEncrypted
  • Est exécuté
  • IsExtendedProc
  • IsForeignKey
  • Est indexé
  • Est indexable
  • IsInlineFunction
  • IsMSShipped
  • IsPrimaryKey
  • EstProcédure
  • IsQuotedIdentOn
  • EstQueue
  • IsReplProc
  • EstRègle
  • IsScalarFunction
  • IsSchemaBound
  • IsSystemTable
  • IsSystemVerified
  • EstTable
  • EstTableFonction
  • EstTrigger
  • IsUniqueCnst
  • IsUserTable
  • IsView
  • Identifiant du propriétaire
  • ID de schéma
  • 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
  • TableTemporalType

Consultez la documentation Microsoft pour une explication détaillée de chaque propriété.