Compartir a través de


El índice de texto completo de SQL Server en la columna XML no indexa los valores de atributo de los nodos internos

Este artículo le ayuda a resolver el problema en el que el índice de texto completo de SQL Server en la columna XML no indexa los valores de atributo de los nodos internos.

Versión del producto original: SQL Server
Número de KB original: 2513181

Síntomas

En Microsoft SQL Server, al indexar una columna XML mediante texto completo, solo se indexan los valores de nodo y los valores de atributo del nodo superior. Los valores de atributo de cualquiera de los nodos internos no se indexan.

Causa

Este comportamiento se produce porque el separador de palabras XML que se incluye con SQL Server no devuelve valores de atributo para ninguno de los nodos internos (xmlfilt.dll : versión: 12.0.9735.0).

Solución

Este problema se puede resolver mediante el separador de palabras XML que se incluye con el sistema operativo Windows cuando SQL Server se ejecuta en Windows 7 o Windows Server 2008 R2 (la versión incluida con Windows usa un nombre de archivo diferente: xmlfilter.dll). Si ejecuta SQL Server en una versión inferior de Windows, primero debe actualizar a estos sistemas operativos y, a continuación, use el procedimiento siguiente para resolver este problema.

Procedimiento para resolver el problema en servidores SQL Server que se ejecutan en entornos de Windows Server 2008 R2 y Windows 7:

Importante

Esta sección, método o tarea contiene pasos que le indican cómo modificar el Registro. No obstante, pueden producirse problemas graves si modifica el registro de manera incorrecta. Por lo tanto, asegúrese de que sigue estos pasos con atención. Para la protección añadida, realice una copia de seguridad del Registro antes de modificarlo. A continuación, puede restaurar el Registro si se produce un problema. Para obtener más información sobre cómo realizar copias de seguridad y restaurar el registro, vea Cómo hacer copia de seguridad y restaurar el registro en Windows.

Nota:

Debe reiniciar el servicio SQL Server después de pasar por el procedimiento siguiente para que los cambios entren en vigor.

  1. Vaya al subárbol del Registro siguiente en el equipo con SQL Server y guárdelo como SQLMSSearch.reg.

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSearch\CLSID

    Nota:

    Reemplace la "<instancia>" en la ruta de acceso por el identificador de instancia correspondiente de SQL Server o SQL Server.

    Por ejemplo, "MSQL10. MSSQLSERVER" para una instancia predeterminada o "MSSQL10. KATMAI" para una instancia con nombre "Katmai".

    Para obtener más información, vea Ubicaciones de archivos para las instancias predeterminadas y con nombre de SQL Server.

  2. Edite SQLMSSearch.reg archivo con el Bloc de notas y reemplace todas las apariciones de xmlfilt.dll por C:\Windows\system32\xmlfilter.dll y, a continuación, guarde los cambios.

    Nota:

    • Esto supone que la carpeta de Windows se encuentra en C:\Windows.
    • Tienes que escribir cada barra diagonal inversa en la nueva ruta de acceso dos veces!
  3. Seleccione el archivo SQLMSSearch.reg para importar el contenido en el registro.

  4. Ejecute los siguientes comandos de T-SQL para habilitar la nueva configuración en SQL Server:

    EXEC sp_fulltext_service 'load_os_resources', 1
    EXEC sp_fulltext_service 'verify_signature ', 0 
    EXEC sp_fulltext_service 'update_languages'
    EXEC sp_fulltext_service 'restart_all_fdhosts'
    
  5. Compruebe la disponibilidad de la nueva configuración con este comando de T-SQL:

    EXEC sp_help_fulltext_system_components 'fullpath','c:\windows\system32\xmlfilter.dll'
    

    Nota:

    Debe adaptar el comando anterior para adaptarse a la ruta de acceso correcta del sistema de Windows en el sistema. Además, asegúrese de que todos los idiomas (respectivamente su lcid), que deben mostrar el nuevo comportamiento se muestran en la columna "componentname" de la salida.

Más información

Pasos para reproducir el problema:

  1. Cree una tabla sencilla de la siguiente manera:

    CREATE TABLE [dbo].[testFTS]([idField] [int] PRIMARY KEY,
    [xmlField] [xml] NOT NULL)
    
  2. Habilite FTS en el campo xmlField (el lenguaje de separación de palabras que seleccione aquí no es relevante para la reproducción).

  3. Inserte un registro en esa tabla, como se indica a continuación:

    INSERT INTO testFTS (idField, xmlField) values
    (1, '<TopNode TopFirstAtt="TopAttValue" TopSecondAtt="Second Value">
    <MiddleNode FirstAtt="ValueOne" SecondAtt="ValueTwo" ThirdAtt="ValueThree">
    <BottomNode BottomAtt="BottomValue">
    <InnerMostNode>Innermost Text</InnerMostNode>
    </BottomNode>
    </MiddleNode>
    <MiddleNode FirstAtt="ValueFour" SecondAtt="ValueFive" ThirdAtt="ValueSix">
    <BottomNode BottomAtt="OtherBottomValue" />
    </MiddleNode>
    <MiddleNode FirstAtt="ValueSeven" SecondAtt="ValueEight" ThirdAtt="ValueNine">
    <BottomNode BottomAtt="LastValue" />
    </MiddleNode>
    <NodeWithValue>Testing whether this value will be indexed</NodeWithValue>
    </TopNode>')
    
  4. Consultando fts_index_keywords para esta tabla concreta: select * from sys.dm_fts_index_keywords(db_id(),object_id('testFTS')), se obtienen los siguientes resultados:

    keyword display_term column_id document_count
    0x0069006E00640065007800650064 indexado 2 1
    0x0069006E006E00650072006D006F00730074 más profundo 2 1
    0x007300650063006F006E0064 second 2 1
    0x00740065007300740069006E0067 probar 2 1
    0x0074006500780074 text 2 1
    0x0074006F007000610074007400760061006C00750065 topattvalue 2 1
    0x00760061006C00750065 value 2 1
    0x0077006800650074006800650072 si 2 1
    0xFF FIN DEL ARCHIVO 2 1

    Estos términos para mostrar parecen estar restringidos a:

    • Valores de nodo, independientemente de la profundidad en que se anidan en el documento XML.
    • Los valores de atributo solo para el nodo superior y no desde ninguno de los nodos internos que se esperarían.