Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como OBJECTPROPERTY() funciona no SQL Server


No SQL Server, o OBJECTPROPERTY() A função retorna informações sobre objetos com escopo de esquema no banco de dados atual.

Esses objetos com escopo de esquema são os que você pode ver consultando o sys.objects visualização do catálogo do sistema. Ele não pode ser usado para objetos que não têm escopo de esquema.

Você pode usar OBJECTPROPERTY() para verificar se um objeto é uma tabela, visão, procedimento armazenado, etc. Você também pode usá-lo para verificar se uma tabela tem uma chave primária, chave estrangeira, referência de chave estrangeira, etc.


Sintaxe


A sintaxe é simples. A função aceita dois argumentos:o ID do objeto e a propriedade que você deseja retornar.
OBJECTPROPERTY ( id , property )

Exemplo 1 – Uso básico


Aqui está um exemplo para demonstrar o uso básico desta função.
SELECT OBJECTPROPERTY('885578193', 'IsTable') AS Result;

Resultado:
+----------+
| Result   |
|----------|
| 1        |
+----------+

Nesse caso, há um objeto com um ID de 885578193 e é uma mesa.

Eu sei que é uma tabela porque o resultado do IsTable propriedade é 1 . Se o objeto não fosse uma tabela, o resultado aqui seria 0 .

Exemplo 2 – Nomeando o objeto


No exemplo anterior, eu sabia o ID do objeto. Na maioria dos casos, você provavelmente saberá apenas o nome do objeto, mas não seu ID. Nesses casos, você pode usar o OBJECT_ID() função para obter o ID do objeto, com base em seu nome.

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

Resultado:
+----------+
| Result   |
|----------|
| 1        |
+----------+

Exemplo 3 - Nome do objeto qualificado


Ao chamar o OBJECT_ID() função, você também pode fornecer um nome de duas ou três partes (para incluir o nome do esquema e o nome do banco de dados).
SELECT OBJECTPROPERTY(OBJECT_ID(N'Music.dbo.Artists'), 'IsTable') AS Result;

Resultado:
+----------+
| Result   |
|----------|
| 1        |
+----------+

No entanto, não deixe que isso o leve a pensar que OBJECTPROPERTY() usará esse banco de dados. Não vai (a menos que seja o mesmo que o banco de dados atual). No que diz respeito, está simplesmente recebendo um ID de objeto. Esquecer isso pode levar a um resultado enganoso.

Aqui está um exemplo para demonstrar.
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];

Resultado:
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)

Neste exemplo, dois bancos de dados diferentes têm um objeto com o mesmo ID. Um deles é uma mesa e o outro não. Assim, obtemos um resultado negativo na primeira consulta e positivo na segunda.

Exemplo 4 – Mais propriedades


Aqui está um exemplo que retorna mais propriedades.
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;

Resultado (usando saída vertical):
OwnerId            | 1
SchemaId           | 6
IsTable            | 1
TableHasPrimaryKey | 1
TableHasForeignKey | 0
TableHasForeignRef | 1
TableHasIdentity   | 0

Estas são apenas algumas das 103 propriedades que você pode consultar OBJECTPROPERTY() por. Veja abaixo uma lista completa.

Exemplo 5 - Em uma cláusula WHERE


Você pode usar OBJECTPROPERTY() em um WHERE cláusula, se necessário.

Neste exemplo, executo duas consultas:uma que retorna tabelas que possuem uma chave estrangeira e outra que retorna tabelas referenciadas por uma chave estrangeira.
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;

Resultado:
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)

Lista completa de propriedades


Aqui está uma lista completa de propriedades suportadas por OBJECTPROPERTY() :
  • CnstIsClustKey
  • CnstIsColumn
  • CnstIsDeleteCascade
  • CnstIsDisabled
  • CnstIsNonclustKey
  • CnstIsNotRepl
  • CnstIsNotTrusted
  • CnstIsUpdateCascade
  • ExecIsAfterTrigger
  • ExecIsAnsiNullsOn
  • ExecIsDeleteTrigger
  • ExecIsFirstDeleteTrigger
  • ExecIsFirstInsertTrigger
  • ExecIsFirstUpdateTrigger
  • ExecIsInsertTrigger
  • ExecIsInsteadOfTrigger
  • ExecIsLastDeleteTrigger
  • ExecIsLastInsertTrigger
  • ExecIsLastUpdateTrigger
  • ExecIsQuotedIdentOn
  • ExecIsStartup
  • ExecIsTriggerDesativado
  • ExecIsTriggerNotForRepl
  • ExecIsUpdateTrigger
  • ExecIsWithNativeCompilation
  • HasAfterTrigger
  • HasDeleteTrigger
  • HasInsertTrigger
  • HasInsteadOfTrigger
  • HasUpdateTrigger
  • IsAnsiNullsOn
  • IsCheckCnst
  • ÉRestrição
  • É padrão
  • IsDefaultCnst
  • ÉDeterminístico
  • Está criptografado
  • IsExecuted
  • IsExtendedProc
  • IsForeignKey
  • É Indexado
  • É indexável
  • IsInlineFunction
  • IsMSEnviado
  • IsPrimaryKey
  • IsProcedure
  • IsQuotedIdentOn
  • IsQueue
  • IsReplProc
  • IsRule
  • IsScalarFunction
  • IsSchemaBound
  • IsSystemTable
  • IsSystemVerified
  • ÉTabela
  • IsTableFunction
  • ÉAcionador
  • IsUniqueCnst
  • IsUserTable
  • IsView
  • Proprietário
  • EsquemaId
  • 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
  • A tabela é falsa
  • TableIsLockedOnBulkLoad
  • TableIsMemoryOtimizado
  • A tabela está fixada
  • TableTextInRowLimit
  • TableUpdateTrigger
  • TableUpdateTriggerCount
  • TableHasColumnSet
  • TableTemporalType

Consulte a documentação da Microsoft para obter uma explicação detalhada de cada propriedade.