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 |
| |
Propiedades admitidas |
|
|
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.