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

OBJECTPROPERTY() vs OBJECTPROPERTYEX() en SQL Server:¿Cuál es la diferencia?

En SQL Server, es posible que haya encontrado el OBJECTPROPERTY() función, solo para descubrir que también hay un OBJECTPROPERTYEX() función que parece hacer exactamente lo mismo.

¿Que está pasando aqui? ¿Por qué la necesidad de dos funciones que hagan lo mismo?

Tengo entendido que Microsoft eligió agregar OBJECTPROPERTYEX() para extender la funcionalidad de OBJECTPROPERTY() , en lugar de introducir cambios en OBJECTPROPERTY() que potencialmente rompería el código existente en los sistemas heredados.

Así que hay algunos diferencias entre las dos funciones.

¿Qué es diferente?

En pocas palabras, OBJECTPROPERTYEX() admite seis propiedades adicionales y su tipo de devolución es diferente.

Aquí hay un desglose.

PROPIEDAD DEL OBJETO() PROPIEDADOBJETOEX()
Tipo de devolución int variante_sql
Número de propiedades admitidas 103 109
Propiedades adicionales
  • Tipo base
  • EsPreciso
  • Acceso a datos del sistema
  • Extracción semántica de texto completo de tabla
  • Acceso a datos de usuario
  • Cardinalidad
Propiedades admitidas
  • 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
  • Tipo base
  • 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
  • EsPreciso
  • 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
  • Acceso a datos del sistema
  • 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
  • Extracción semántica de texto completo de tabla
  • 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
  • Acceso a datos de usuario
  • La tabla tiene un conjunto de columnas
  • Cardinalidad
  • Tipo temporal de tabla

Ejemplo de las Propiedades Extra

Aquí hay un ejemplo que muestra estas propiedades adicionales en uso.

USE WideWorldImportersDW;
DECLARE @objectId int = OBJECT_ID(N'Integration.GenerateDateDimensionColumns');
SELECT 
  OBJECTPROPERTYEX(@objectId, 'BaseType') AS BaseType,
  OBJECTPROPERTYEX(@objectId, 'IsPrecise') AS IsPrecise,
  OBJECTPROPERTYEX(@objectId, 'SystemDataAccess') AS SystemDataAccess,
  OBJECTPROPERTYEX(@objectId, 'TableFullTextSemanticExtraction') AS TableFullTextSemanticExtraction,
  OBJECTPROPERTYEX(@objectId, 'UserDataAccess') AS UserDataAccess,
  OBJECTPROPERTYEX(@objectId, 'Cardinality') AS Cardinality;

Resultado (usando salida vertical):

BaseType                        | IF
IsPrecise                       | 0
SystemDataAccess                | 1
TableFullTextSemanticExtraction | 0
UserDataAccess                  | 1
Cardinality                     | NULL

En este caso, el objeto es una función con valores de tabla y devuelve datos para cinco de las seis propiedades.

Ahora pasemos el nombre de una tabla para ver si podemos obtener un valor para la cardinalidad.

USE WideWorldImportersDW;
DECLARE @objectId int = OBJECT_ID(N'Dimension.City');
SELECT 
  OBJECTPROPERTYEX(@objectId, 'BaseType') AS BaseType,
  OBJECTPROPERTYEX(@objectId, 'IsPrecise') AS IsPrecise,
  OBJECTPROPERTYEX(@objectId, 'SystemDataAccess') AS SystemDataAccess,
  OBJECTPROPERTYEX(@objectId, 'TableFullTextSemanticExtraction') AS TableFullTextSemanticExtraction,
  OBJECTPROPERTYEX(@objectId, 'UserDataAccess') AS UserDataAccess,
  OBJECTPROPERTYEX(@objectId, 'Cardinality') AS Cardinality;

Resultado (usando salida vertical):

BaseType                        | U 
IsPrecise                       | NULL
SystemDataAccess                | NULL
TableFullTextSemanticExtraction | 0
UserDataAccess                  | NULL
Cardinality                     | 116295

Esta vez obtenemos NULL para tres de las propiedades, pero obtenemos un valor para la propiedad Cardinalidad.