CORREGIR: Mensajes de error después de que SQL ServerSQL Server se haya estado ejecutando durante algún tiempo en Windows Server 2003 o en Windows 2000: "No se pudo cargar FileName.dll" y "Los intentos de cargar cualquier tipo de dll pueden fallar en el proceso de SQL Server"

Se aplica a: SQL Server 2008 R2 StandardSQL Server 2008 R2 WorkgroupSQL Server 2008 R2 Developer

Síntomas


Al ejecutar Microsoft SQL Server en un equipo basado en Windows Server 2003 o en un equipo basado en Windows 2000, puede recibir un mensaje de error que contiene los siguientes mensajes de error:
  • No se pudo cargar FileName.dll
  • Los intentos de cargar cualquier tipo de dll pueden producir un error dentro del proceso de SQL ServerSQL Server con errores que apuntan al error LoadLibrary.
Este problema suele producirse después de que SQL ServerSQL Server se haya estado ejecutando durante algún tiempo. El mensaje de error completo que recibe es similar al siguiente:
Tipo de excepción: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseExceptionMessage: Error en la lectura de la base de datos. Motivo: No se pudo cargar Msxmlsql.dll.Data: System.Collections.ListDictionaryI,4092,NULL,NULL,2007-04-13 09:44:11.640,DB-SQLServer5,warning,2007-04-13 09:44:13.153,The activated [proc dbo]. [sp_sysmail_activate] que se ejecuta en la cola msdb.dbo.ExternalMailQueue genera lo siguiente: 'La cola de servicio "ExternalMailQueue" está actualmente deshabilitada.'Se produce un error en los intentos de usar la actividad relacionada con XML en TSQL. Msg 6610, Nivel 16, Estado 1, Procedimiento sp_xml_preparedocument, Línea 1No se pudo cargar Msxmlsql.dll.Msg 6607, Nivel 16, Estado 3, Proceduresp_xml_removedocument, Línea 1 sp_xml_removedocument: El valor proporcionado para el parámetro número 1 no es válido. Los intentos de cargar cualquier tipo de dll pueden producir un error dentro del proceso de SQL ServerSQL Server con errores que apuntan al error LoadLibrary. Los intentos de usar procedimientos almacenados extendidos darán como resultado Msg 0, Nivel 16, Estado 0, Procedimiento xp_ss_backup, Línea 1No se puede cargar el archivo DLL C:-Archivos de programa-Microsoft SQL Server-MSSQL-Binn-SQLsafe_ExtendedStoredProc.dll o uno de los archivos DLL a los que hace referencia. Motivo: 1114(Error en la rutina de inicialización de una biblioteca de vínculos dinámicos (DLL). Error: 18210, Gravedad: 16, Estado: 1.BackupVirtualDeviceSet::Initialize: Error de CoCreateInstance en el dispositivo de copia de seguridad 'd4630f27-03a1-47ae-b7a7-4813a6809908'. Error del sistema operativo 0x8007045a (Error en la rutina de inicialización de una biblioteca de vínculos dinámicos (DLL). Error: 6512, Gravedad: 16, Estado: 27.No se pudo inicializar Common Language Runtime (CLR) v2.0.50727 con HRESULT 0x80004005. Debe reiniciar SQL Server para usar las características de integración de CLR.

Causa


Este problema se produce porque no hay ninguna ranura de almacenamiento local de subprocesos (TLS) disponible para el proceso de SQL Server (Sqlservr.exe). Esto es un problema en Windows Server 2003 y en Windows 2000.When SQL Server descarga un archivo DLL, las ranuras TLS que utiliza el archivo DLL no se pueden liberar debido a un problema en la función TlsFree. Si SQL ServerSQL Server carga con frecuencia varios archivos DLL y, a continuación, descarga estos archivos DLL, estos archivos DLL usan todas las ranuras TLS disponibles. Finalmente, SQL ServerSQL Server ya no puede cargar un archivo DLL que requiera ranuras TLS.

Resolución


Nota Esta resolución es solo para Windows Server 2003. Si utiliza Windows 2000, siga los pasos de la sección "Solución"."

Información de revisión para Windows Server 2003

Una revisión compatible está disponible en Microsoft. Sin embargo, esta revisión está diseñada para corregir solo el problema que se describe en este artículo. Aplique este hotfix solo a los sistemas que están experimentando este problema específico. Esta revisión puede recibir pruebas adicionales. Por lo tanto, si no se ve gravemente afectado por este problema, se recomienda que espere a la próxima actualización de software que contiene esta revisión. Si la revisión está disponible para su descarga, hay una sección "Descarga de revisión disponible" en la parte superior de este artículo de Knowledge Base. Si no aparece esta sección, póngase en contacto con el servicio de atención al cliente y soporte técnico de Microsoft para obtener la revisión. Nota Si se producen problemas adicionales o si se requiere alguna solución de problemas, es posible que tenga que crear una solicitud de servicio independiente. Los costos de soporte técnico habituales se aplicarán a preguntas de soporte técnico adicionales y problemas que no califican para esta revisión específica. Para obtener una lista completa de los números de teléfono de servicio al cliente y soporte técnico de Microsoft o para crear una solicitud de servicio independiente, visite el siguiente sitio Web de Microsoft:Nota El formulario "Descarga de revisión disponible" muestra los idiomas para los que está disponible la revisión. Si no ve el idioma, es porque una revisión no está disponible para ese idioma.
Requisitos previos
Debe tener Windows Server 2003 Service Pack 2 instalado en el servidor. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
889100 Cómo obtener el Service Pack más reciente para Windows Server 2003
Información de reinicio
Debe reiniciar el equipo después de aplicar este hotfix.
Información de la sustitución de revisión
Esta revisión no reemplaza ninguna otra revisión.
Información de archivo
La versión en inglés de esta revisión tiene los atributos de archivo (o atributos de archivo posteriores) que se enumeran en la tabla siguiente. Las fechas y horas de estos archivos se enumeran en hora universal coordinada (UTC). Al ver la información del archivo, se convierte a la hora local. Para encontrar la diferencia entre la hora UTC y la hora local, utilice la ficha Zona horaria del elemento Fecha y hora del Panel de control. Windows Server 2003 con Service Pack 2, versiones basadas en x86
Nombre de archivoVersión del archivoTamaño del archivoFechaHoraPlataforma
Ntkrpamp.exe5.2.3790.41772,348,03229-Oct-200719:01x86
Windows Server 2003 con Service Pack 2, versiones basadas en x64
Nombre de archivoVersión del archivoTamaño del archivoFechaHoraPlataforma
Hal.dll5.2.3790.4225280,06428-Jan-200810:42x64
Ntkrnlmp.exe5.2.3790.42254,603,90428-Jan-200810:42x64
Ntoskrnl.exe5.2.3790.42254,533,76028-Jan-200810:42x64
Windows Server 2003 con Service Pack 2, versiones basadas en IA64
Nombre de archivoVersión del archivoTamaño del archivoFechaHoraPlataforma
Ntdll.dll5.2.3790.42251,636,86428-Jan-200810:40IA-64
Ntkrnlmp.exe5.2.3790.42256,568,96028-Jan-200810:40IA-64

Solución


Puede utilizar uno de los métodos siguientes para evitar este problema. Se recomienda usar el método 1 porque la característica de procedimiento almacenado extendido se puede quitar en futuras versiones de SQL Server.

Método 1

  1. Use el procedimiento almacenado sp_OACreate para determinar los archivos DLL que SQL ServerSQL Server carga en el proceso de SQL ServerSQL Server . Para ello, siga estos pasos:
    1. Abra SQL Profiler y, a continuación, conéctese a la instancia de SQL Server.
    2. En el cuadro de diálogo Propiedades de seguimiento, especifique el nombre del seguimiento, especifique la ubicación donde SQL Profiler guarda el seguimiento y, a continuación, haga clic en Ejecutar.
    3. Después de ejecutar SQL Profiler durante algún tiempo, analice el seguimiento para localizar las apariciones del procedimiento almacenado sp_OACreate.
    4. Observe el primer parámetro de cada aparición del procedimiento almacenado sp_OACreate.Nota El primer parámetro indica el identificador de programación (ProgID) del objeto OLE o el identificador de clase (CLSID) del objeto OLE.
    5. Determine el archivo DLL que contiene este objeto OLE.
    Nota Puede usar SQL ProfilerSQL Profiler para supervisar la instancia de SQL ServerSQL Server al iniciar el servicio SQL ServerSQL Server .
  2. Asegúrese de que ha habilitado la opción Procedimientos de automatización OLE. Para obtener más información acerca de cómo determinar si la opción Procedimientos de automatización OLE está habilitada y cómo habilitar la opción Procedimientos de automatización OLE, visite el siguiente sitio Web de Microsoft Develop Network (MSDN):
  3. En SQL Server Management StudioSQL Server Management Studio de SQL Server 2008 R2, de SQL Server 2008 o de SQL Server 2005 o en el Analizador de consultas SQL de SQL Server 2000, ejecute las instrucciones siguientes. Nota  Por ejemplo, el código siguiente muestra cómo cargar el archivo Wbemdisp.dll.
    DROP PROC sp_Load_DllGOCREATE PROC sp_Load_DllASdeclare @WmiServiceLocator int, @hr intexec @hr = sp_OACreate 'WbemScripting.SWbemLocator', @WmiServiceLocator output if @hr = 0 raiserror ( 'wbemdisp.dll loaded into sql address space by startup procedure sp_Load_Dll, Object Info: %d' , 10 , 1 , @WmiServiceLocator) --WITH LOGWHILE 1=1 WAITFOR DELAY '01:00:00'GOEXEC sp_procoption 'sp_Load_Dll' , 'startup' , 'true' GO
    Las instrucciones crean un procedimiento almacenado. Las instrucciones también permiten que el procedimiento almacenado se ejecute cuando se inicia el servicio SQL ServerSQL Server . Este procedimiento almacenado realiza las siguientes operaciones:
    • Carga el archivo Wbemdisp.dll.
    • Mantiene el archivo Wbemdisp.dll en memoria porque las instrucciones no se cierran.
    Mientras el archivo Wbemdisp.dll esté en memoria, otras instrucciones no vuelven a cargar el archivo Wbemdisp.dll. Por lo tanto, SQL ServerSQL Server no llama a la función TlsAlloc y a la función TlsFree para el archivo Wbemdisp.dll. Nota Debe actualizar el código para cargar los archivos DLL que determinó en el paso 1.
  4. Agregue las instrucciones al procedimiento almacenado sp_Load_Dll en el paso 3. Estas instrucciones cargan los archivos DLL que determinó en el paso 1.
  5. Reinicie el servicio de SQL Server.
  6. Compruebe que SQL ServerSQL Server carga el archivo Wbemdisp.dll en memoria. Para ello, siga estos pasos:
    1. Abra el archivo de registro de errores de SQL Server.
    2. Busque el siguiente mensaje:
      wbemdisp.dll cargado en el espacio de direcciones sql por procedimiento de inicio sp_Load_Dll
      Nota Este mensaje indica que SQL ServerSQL Server ha cargado el archivo Wbemdisp.dll.
    3. En un símbolo del sistema, ejecute el siguiente comando:
      tasklist /m
    4. En el resultado que se obtiene, busque el proceso Sqlservr.exe y, a continuación, compruebe que aparece el archivo Wbemdisp.dll. Nota Si aparece el archivo Wbemdisp.dll, SQL ServerSQL Server ha cargado el archivo Wbemdisp.dll.

Método 2

  1. Use el procedimiento almacenado sp_OACreate para determinar los archivos DLL que SQL ServerSQL Server carga en el proceso de SQL ServerSQL Server . Para ello, siga estos pasos:
    1. Abra SQL Profiler y, a continuación, conéctese a la instancia de SQL Server.
    2. En el cuadro de diálogo Propiedades de seguimiento, especifique el nombre del seguimiento, especifique la ubicación donde SQL Profiler guarda el seguimiento y, a continuación, haga clic en Ejecutar.
    3. Después de ejecutar SQL Profiler durante algún tiempo, analice el seguimiento para localizar las apariciones del procedimiento almacenado sp_OACreate.
    4. Observe el primer parámetro de cada aparición del procedimiento almacenado sp_OACreate.Nota El primer parámetro indica el identificador de programación (ProgID) del objeto OLE o el identificador de clase (CLSID) del objeto OLE.
    5. Determine el archivo DLL que contiene este objeto OLE.
    Nota Puede usar SQL Server ProfilerSQL Server Profiler para supervisar la instancia de SQL ServerSQL Server al iniciar el servicio SQL ServerSQL Server .
  2. Cree un procedimiento almacenado extendido. El procedimiento almacenado extendido contiene una función que carga los archivos DLL que determinó en el paso 1.
  3. Agregue el procedimiento almacenado extendido a SQL Server.
  4. En SQL ServerSQL Server, use el procedimiento almacenado del sistema sp_addextendedproc para registrar la función en el procedimiento almacenado extendido.
  5. Use el procedimiento almacenado sp_procoption para permitir que el procedimiento almacenado extendido se inicie automáticamente cuando se inicie el servicio SQL ServerSQL Server .
  6. Reinicie el servicio de SQL Server.
Cuando SQL ServerSQL Server ejecuta la función en el procedimiento almacenado extendido, SQL ServerSQL Server carga los archivos DLL mediante una llamada a la API LoadLibrary.

Estado


Esto no es un problema en SQL Server. Esto es un problema en Windows Server 2003 y en Windows 2000. Este problema no se produce en Windows Vista ni en Windows Server 2008.

Referencias


Para obtener más información acerca de la función TlsAlloc, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):Para obtener más información acerca de la función TlsFree, visite el siguiente sitio Web de MSDN:Para obtener más información acerca del procedimiento almacenado sp_OACreate, visite el siguiente sitio Web de MSDN: