hierarchyid (Transact-SQL)
El tipo de datos del sistema de hierarchyid es de longitud variable. Use hierarchyid para representar la posición en una jerarquía. Una columna de tipo hierarchyid no representa automáticamente un árbol. Dependerá de la aplicación generar y asignar los valores hierarchyid de tal forma que la relación deseada entre las filas se refleje en los valores.
Un valor del tipo de datos hierarchyid representa una posición en una jerarquía de árbol. Los valores de hierarchyid tienen las siguientes propiedades.
Muy compactos
El número medio de bits necesarios para representar un nodo en un árbol con n nodos depende del promedio de nodos secundarios (el promedio de elementos secundarios de un nodo). Para multiplicadores de salida pequeños (0-7), el tamaño es aproximadamente 6*logAn bits, donde A es el promedio de nodos secundarios. Un nodo en una jerarquía organizativa de 100.000 personas con un promedio de nodos secundarios de 6 niveles supone aproximadamente 38 bits. Esto se redondea a 40 bits (o 5 bytes) para el almacenamiento.
La comparación se realiza con prioridad a la profundidad
Dados dos valores hierarchyid a y b, a<b quiere decir que a viene antes que b en un corte transversal de prioridad a la profundidad del árbol. Los índices de los tipos de datos hierarchyid están en orden con prioridad a la profundidad y los nodos cercanos entre sí en un corte transversal de prioridad a la profundidad se almacenan casi uno junto a otro. Por ejemplo, los elementos secundarios de un registro se almacenan adyacentes a ese registro. Para obtener más información, consulte Datos jerárquicos (SQL Server).
Compatibilidad con inserciones y eliminaciones arbitrarias
Con el método GetDescendant siempre es posible generar un miembro del mismo nivel a la derecha de cualquier nodo determinado, a la izquierda de cualquier nodo determinado, o entre dos miembros cualesquiera del mismo nivel. Se mantiene la propiedad comparison cuando se inserta o elimina un número arbitrario de nodos de la jerarquía. La mayoría de las inserciones y eliminaciones conservan la propiedad compactness. Sin embargo, las inserciones entre dos nodos generarán valores hierarchyid con una representación ligeramente menos compacta.
La codificación usada en el tipo hierarchyid está limitada a 892 bytes. Por consiguiente, el tipo hierarchyid no podrá representar los nodos con demasiados niveles en su representación como para caber en los 892 bytes.
El tipo hierarchyid está disponible para los clientes CLR como el tipo de datos SqlHierarchyId.
Comentarios
El tipo hierarchyid codifica lógicamente la información de un nodo único en un árbol de jerarquía mediante la codificación de la ruta de acceso desde la raíz del árbol hasta el nodo. Este tipo de ruta de acceso se representa lógicamente como una secuencia de etiquetas de nodo de todos los elementos secundarios visitados después de la raíz. Una barra diagonal inicia la representación y una barra diagonal única representa una ruta de acceso que solo visita la raíz. Para los niveles por debajo de la raíz, cada etiqueta se codifica como una secuencia de enteros separados por puntos. La comparación entre los elementos secundarios se realiza comparando las secuencias de enteros separados por puntos en orden alfabético. Una barra diagonal termina cada nivel. Por consiguiente, una barra diagonal separa los elementos primarios de los secundarios. Por ejemplo, los niveles de las siguientes rutas de acceso hierarchyid son 1, 2, 2, 3 y 3, respectivamente:
/
/1/
/0.3.-7/
/1/3/
/0.1/0.2/
Pueden insertarse los nodos en cualquier ubicación. Los nodos insertados después de /1/2/ pero antes de /1/3/ pueden representarse como /1/2.5/. Los nodos insertados antes de 0 tienen la representación lógica de un número negativo. Por ejemplo, un nodo que viene antes de /1/1/ puede representarse como /1/-1/. Los nodos no pueden tener ceros a la izquierda. Por ejemplo, /1/1.1/ es válido, pero /1/1.01/ no lo es. Para evitar errores, inserte los nodos utilizando el método GetDescendant.
Conversión de tipo de datos
El tipo de datos hierarchyid puede convertirse a otros tipos de datos de la siguiente manera:
Use el método ToString() para convertir el valor hierarchyid a la representación lógica como un tipo de datos nvarchar(4000).
Use Read () y Write () para convertir hierarchyid a varbinary.
Para transmitir los parámetros hierarchyid a través de SOAP, conviértalos previamente a cadenas.
Actualizar bases de datos
Cuando se actualiza una base de datos a SQL Server 2012, se instalan automáticamente el nuevo ensamblado y el tipo de datos hierarchyid. Las reglas de asesor de actualizaciones detectan tipos de usuario o ensamblados con nombres problemáticos. El asesor de actualizaciones aconsejará el cambio de nombre de los ensamblados problemáticos, y el cambio de nombre de los tipos problemáticos o la utilización de nombres de dos partes en el código para hacer referencia al tipo de usuario preexistente.
Si una actualización de la base de datos detecta un ensamblado del usuario con un nombre problemático, cambiará automáticamente el nombre del ensamblado y colocará la base de datos en modo sospechoso.
Si durante la actualización se encuentra un tipo de usuario con un nombre problemático, no se llevará a cabo ningún procedimiento especial. Después de la actualización, existirán tanto el tipo de usuario anterior como el nuevo tipo de sistema. El tipo de usuario solo estará disponible a través de nombres de dos partes.
Usar columnas hierarchyid en tablas replicadas
Las columnas de tipo hierarchyid pueden usarse en cualquier tipo de tabla replicada. Los requisitos para su aplicación dependen de si la replicación es unidireccional o bidireccional, y de las versiones de SQL Server usadas.
Replicación unidireccional
La replicación unidireccional incluye la replicación de instantáneas, replicación transaccional y replicación de mezcla en las que las modificaciones no se realizan en el suscriptor. El funcionamiento de las columnas hierachyid con la replicación unidireccional depende de la versión de SQL Server que el suscriptor está ejecutando.
Un publicador de SQL Server 2012 puede replicar las columnas hierachyid a un suscriptor SQL Server 2012 sin ninguna consideración especial.
Un publicador de SQL Server 2012 debe convertir las columnas hierarchyid para replicarlas a un suscriptor que esté ejecutando SQL Server Compact o una versión anterior de SQL Server. SQL Server Compact y las versiones anteriores de SQL Server no admiten columnas de tipo hierarchyid. Si está usando una de estas versiones, todavía puede replicar los datos a un suscriptor. Para ello, debe establecer una opción de esquema o el nivel de compatibilidad de la publicación (para la replicación de mezcla) de modo que la columna se pueda convertir en un tipo de datos compatible.
Se admite el filtrado de columnas en ambos escenarios. Esto incluye el filtrado de las columnas hierarchyid. Se admite el filtrado de filas con tal de que el filtro no incluya una columna hierarchyid.
Replicación bidireccional
La replicación bidireccional incluye la replicación transaccional con suscripciones de actualización, replicación transaccional del mismo nivel y replicación de mezcla en la que se realizan los cambios en el suscriptor. La replicación le permite configurar una tabla con columnas hierarchyid para la replicación bidireccional. Tenga en cuenta los siguientes requisitos y consideraciones.
El publicador y todos los suscriptores deben ejecutar SQL Server 2012.
La replicación replica los datos como bytes y no realiza ninguna validación para garantizar la integridad de la jerarquía.
No se mantiene la jerarquía de las modificaciones realizadas en el origen (suscriptor o publicador) cuando se replican en el destino.
Los valores hash de las columnas hierarchyid son específicos de la base de datos en la que se generan. Por consiguiente, se pudo generar el mismo valor en el publicador y suscriptor, pero se pudo aplicar a filas diferentes. La replicación no comprueba esta condición y, a diferencia de las columnas IDENTITY, no hay ningún medio integrado de particionar los valores de la columna hierarchyid. Las aplicaciones deben usar restricciones u otros mecanismos para evitar estos conflictos sin detectar.
Es posible que las filas insertadas en el suscriptor sean huérfanas. Es posible que la fila primaria de la fila insertada se haya eliminado en el publicador. Esto producirá un conflicto sin detectar cuando la fila del suscriptor se inserte en el publicador.
Los filtros de columnas no pueden filtrar las columnas hierarchyid que no admiten valores NULL: la operación de inserción desde el suscriptor generará un error porque no hay ningún valor predeterminado de la columna hierarchyid en el publicador.
Se admite el filtrado de filas con tal de que el filtro no incluya una columna hierarchyid.