sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo funciona OBJECTPROPERTY() en SQL Server

En SQL Server, OBJECTPROPERTY() La función devuelve información sobre los objetos del ámbito del esquema en la base de datos actual.

Estos objetos del ámbito del esquema son los que puede ver consultando sys.objects vista del catálogo del sistema. No se puede usar para objetos que no están en el ámbito del esquema.

Puedes usar OBJECTPROPERTY() para verificar si un objeto es una tabla, vista, procedimiento almacenado, etc. También puede usarlo para verificar si una tabla tiene una clave principal, una clave externa, una referencia de clave externa, etc.

Sintaxis

La sintaxis es simple. La función acepta dos argumentos:el ID del objeto y la propiedad que desea devolver.

OBJECTPROPERTY ( id , property )

Ejemplo 1:uso básico

Aquí hay un ejemplo para demostrar el uso básico de esta función.

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

Resultado:

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

En este caso, hay un objeto con una ID de 885578193 y es una mesa

Sé que es una tabla porque el resultado de IsTable la propiedad es 1 . Si el objeto no fuera una tabla, el resultado aquí sería 0 .

Ejemplo 2:nombrar el objeto

En el ejemplo anterior, conocía el ID del objeto. En la mayoría de los casos, probablemente solo conozca el nombre del objeto, pero no su ID. En tales casos, puede usar el OBJECT_ID() función para obtener el ID del objeto, en función de su nombre.

Así:

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

Resultado:

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

Ejemplo 3:Nombre de objeto calificado

Al llamar al OBJECT_ID() función, también puede proporcionar un nombre de dos o tres partes (para incluir el nombre del esquema y el nombre de la base de datos).

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

Resultado:

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

Sin embargo, no dejes que eso te engañe para que pienses que OBJECTPROPERTY() utilizará esa base de datos. No lo hará (a menos que sea la misma que la base de datos actual). En lo que a él respecta, simplemente recibe una identificación de objeto. Olvidar esto podría conducir a un resultado engañoso.

Aquí hay un ejemplo para demostrarlo.

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)

En este ejemplo, dos bases de datos diferentes tienen un objeto con el mismo ID. Uno de ellos es una mesa y el otro no. Entonces obtenemos un resultado negativo en la primera consulta y positivo en la segunda.

Ejemplo 4:más propiedades

Aquí hay un ejemplo que devuelve más propiedades.

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 salida vertical):

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

Estas son solo algunas de las 103 propiedades que puedes consultar OBJECTPROPERTY() por. Consulte a continuación para obtener una lista completa.

Ejemplo 5:en una cláusula WHERE

Puedes usar OBJECTPROPERTY() en un WHERE cláusula si es necesario.

En este ejemplo, ejecuto dos consultas:una que devuelve tablas que tienen una clave externa y otra que devuelve tablas a las que hace referencia una clave externa.

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 propiedades

Aquí hay una lista completa de propiedades admitidas por OBJECTPROPERTY() :

  • CnstIsClustKey
  • CnstEsColumna
  • CnstIsDeleteCascade
  • CnstIsDisabled
  • CnstIsNonclustKey
  • CnstIsNotRepl
  • CnstNoEsDeConfianza
  • CnstIsUpdateCascade
  • ExecIsAfterTrigger
  • ExecIsAnsiNullsOn
  • ExecIsDeleteTrigger
  • ExecIsFirstDeleteTrigger
  • ExecIsFirstInsertTrigger
  • ExecIsFirstUpdateTrigger
  • ExecIsInsertTrigger
  • ExecIsInsteadOfTrigger
  • ExecIsLastDeleteTrigger
  • ExecIsLastInsertTrigger
  • ExecIsLastUpdateTrigger
  • ExecIsQuotedIdentOn
  • ExecIsStartup
  • ExecIsTriggerDisabled
  • ExecIsTriggerNotForRepl
  • ExecIsUpdateTrigger
  • ExecIsWithNativeCompilation
  • HasAfterTrigger
  • HasDeleteTrigger
  • TieneInsertTrigger
  • HasInsteadOfTrigger
  • Tiene activador de actualización
  • AnsiNullsOn
  • IsCheckCnst
  • EsRestricción
  • EsPredeterminado
  • EsCnstPredeterminado
  • EsDeterminista
  • Está cifrado
  • Se ejecuta
  • EsProcExtendido
  • EsClaveExterna
  • Está indexado
  • Es indexable
  • EsFunciónEnLínea
  • EsMSEnviado
  • EsClavePrincipal
  • EsProcedimiento
  • IsQuotedIdentOn
  • Hace cola
  • EsReplProc
  • Es una regla
  • EsFunciónEscalar
  • Está vinculado al esquema
  • EsTablaDeSistema
  • IsSystemVerified
  • EsTabla
  • FunciónEsTabla
  • EsActivador
  • EsCnstÚnico
  • EsTablaUsuario
  • EsVer
  • Id de propietario
  • Id. de esquema
  • Desencadenador de eliminación de tabla
  • TableDeleteTriggerCount
  • Estado de combinación de texto completo de la tabla
  • TableFullTextBackgroundUpdateIndexOn
  • TableFulltextCatalogId
  • TableFulltextChangeTrackingOn
  • TableFulltextDocsProcessed
  • TableFulltextFailCount
  • Recuento de elementos de texto completo de la tabla
  • Columna de clave de texto completo de la tabla
  • TableFulltextPendingChanges
  • TableFulltextPopulateStatus
  • TableHasActiveFulltextIndex
  • TableHasCheckCnst
  • TableHasClustIndex
  • TableHasDefaultCnst
  • TableHasDeleteTrigger
  • TablaTieneClaveExterna
  • La tabla tiene una referencia externa
  • TablaTieneIdentidad
  • TableHasIndex
  • TableHasInsertTrigger
  • TableHasNonclustIndex
  • La tabla tiene clave principal
  • TableHasRowGuidCol
  • TableHasTextImage
  • La tabla tiene marca de tiempo
  • TablaTieneCnstÚnico
  • TableHasUpdateTrigger
  • TableHasVarDecimalStorageFormat
  • Desencadenador de inserción de tabla
  • Recuento de activadores de inserción de tabla
  • La tabla es falsa
  • TableIsLockedOnBulkLoad
  • La tabla está optimizada para memoria
  • La tabla está anclada
  • TableTextInRowLimit
  • Desencadenador de actualización de tabla
  • Recuento de activadores de actualización de tabla
  • La tabla tiene un conjunto de columnas
  • Tipo temporal de tabla

Consulte la documentación de Microsoft para obtener una explicación detallada de cada propiedad.