Sintomi

Quando si esegue Microsoft SQL Server in un computer basato su Windows Server 2003 o in un computer basato su Windows 2000, è che venga visualizzato un messaggio di errore che contiene i seguenti messaggi di errore:

  • Impossibile caricare FileNameDLL

  • I tentativi di caricare qualsiasi tipo di dll potrebbero non riuscire all'interno del processo di SQL Server con errori che puntano all'errore LoadLibrary.

Questo problema si verifica in genere dopo che SQL Server è stato in esecuzione per qualche tempo. Il messaggio di errore completo che viene visualizzato analogo al seguente:

Tipo di eccezione: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseExceptionMessage: la lettura nel database non è riuscita. Motivo: Impossibile caricare 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,L'attivato [proco]. [sp_sysmail_activate] in esecuzione sulla coda msdb.dbo.ExternalMailQueue restituisce quanto segue: 'La coda del servizio "ExternalMailQueue" è attualmente disabilitata.' Tentativi di utilizzare attività correlate XML in TSQL ha esito negativo. Msg 6610, Livello 16, Stato 1, procedura sp_xml_preparedocument, Riga 1Impossibile caricare Msxmlsql.dll.Msg 6607, Livello 16, Stato 3, Proceduresp_xml_removedocument, Riga 1 sp_xml_removedocument: il valore fornito per il numero di parametro 1 non è valido. I tentativi di caricare qualsiasi tipo di dll potrebbero non riuscire all'interno del processo di SQL Server con errori che puntano all'errore LoadLibrary. I tentativi di utilizzare le stored procedure estese comporteranno Msg 0, livello 16, stato 0, procedure xp_ss_backup, riga 1Impossibile caricare la DLL C SQLsafe_ExtendedStoredProc: . Motivo: 1114(una routine di inizializzazione della libreria a collegamento dinamico (DLL) non riuscita.). Errore: 18210, gravità: 16, stato: 1.BackupVirtualDeviceSet::Initialize: Errore CoCreateInstance nel dispositivo di backup 'd4630f27-03a1-47ae-b7a7-4813a6809908'. Errore del sistema operativo 0x8007045a (una routine di inizializzazione della libreria a collegamento dinamico (DLL) non riuscita.). Errore: 6512, gravità: 16, stato: 27. Impossibile inizializzare Common Language Runtime (CLR) v2.0.50727 con HRESULT 0x80004005. È necessario riavviare SQL Server per utilizzare le funzionalità di integrazione CLR.

Causa

Questo problema si verifica perché non è disponibile alcuno slot di archiviazione locale di thread (TLS) per il processo di SQL Server (Sqlservr.exe). Si tratta di un problema in Windows Server 2003 e Windows 2000.Quando SQL Server scarica una DLL, gli slot TLS utilizzati dalla DLL potrebbero non essere rilasciati a causa di un problema nella funzione TlsFree. Se SQL Server carica spesso varie DLL e quindi scarica queste DLL, queste DLL utilizzano tutti gli slot TLS disponibili. Infine, SQL Server non è più possibile caricare una DLL che richiede slot TLS.

Risoluzione

Nota: Questa risoluzione è disponibile solo per Windows Server 2003. Se si utilizza Windows 2000, attenersi alla procedura descritta nella sezione "Workaround".

Informazioni sull'hotfix per Windows Server 2003

Un hotfix supportato è disponibile da Microsoft. Tuttavia, questo hotfix è destinato a correggere solo il problema descritto in questo articolo. Applicare questo hotfix solo ai sistemi che si verificano questo problema specifico. Questo hotfix potrebbe ricevere ulteriori test. Pertanto, se non si è gravemente interessati da questo problema, si consiglia di attendere il prossimo aggiornamento software che contiene questo hotfix. Se l'hotfix è disponibile per il download, è presente una sezione "Hotfix disponibile per il download" all'inizio di questo articolo della Knowledge Base. Se questa sezione non viene visualizzata, contattare il Servizio Supporto Tecnico Clienti Microsoft per ottenere l'hotfix. Nota: Se si verificano ulteriori problemi o se è necessaria una risoluzione dei problemi, potrebbe essere necessario creare una richiesta di servizio separata. I costi di supporto consueti si applicheranno a ulteriori domande di supporto e problemi che non si qualificano per questo hotfix specifico. Per un elenco completo dei numeri di telefono del Servizio Supporto Tecnico Clienti Microsoft o per creare una richiesta di assistenza separata, visitare il seguente sito Web Microsoft:

http://support.microsoft.com/contactus/?ws=supportNota: Il modulo "Hotfix disponibile per il download" visualizza le lingue per le quali è disponibile l'hotfix. Se non viene visualizzata la lingua, è perché un hotfix non è disponibile per tale lingua.

Requisiti

È necessario disporre di Windows Server 2003 Service Pack 2 installato nel server. Per ulteriori informazioni, fare clic sul seguente numero di articolo per visualizzare l'articolo della Microsoft Knowledge Base:

889100 Come ottenere il service pack più recente per Windows Server 2003

Informazioni sul riavvio

È necessario riavviare il computer dopo avere applicato questo hotfix.

Informazioni sulla sostituzione degli hotfix

Questo hotfix non sostituisce altri hotfix.

Informazioni sui file

La versione inglese di questo hotfix presenta gli attributi di file (o attributi successivi) elencati nella tabella seguente. Le date e le ore di questi file sono elencate in formato UTC (Coordinated Universal Time). Quando si visualizzano le informazioni sul file, queste vengono convertite nell'ora locale. Per individuare la differenza tra l'ora UTC e l'ora locale, utilizzare la scheda Fuso orario nell'elemento Data e ora nel Pannello di controllo.Windows Server 2003 con Service Pack 2, versioni basate su x86

Nome file

Versione file

Dimensione file

Date

Ora

Piattaforma

Ntkrpamp.exe

5.2.3790.4177

2,348,032

29-Oct-2007

19:01

x86

Windows Server 2003 con Service Pack 2, versioni basate su x64

Nome file

Versione file

Dimensione file

Date

Ora

Piattaforma

Hal.dll

5.2.3790.4225

280,064

28-Jan-2008

10:42

x64

Ntkrnlmp.exe

5.2.3790.4225

4,603,904

28-Jan-2008

10:42

x64

Ntoskrnl.exe

5.2.3790.4225

4,533,760

28-Jan-2008

10:42

x64

Windows Server 2003 con Service Pack 2, versioni basate su IA64

Nome file

Versione file

Dimensione file

Date

Ora

Piattaforma

Ntdll.dll

5.2.3790.4225

1,636,864

28-Jan-2008

10:40

IA-64

Ntkrnlmp.exe

5.2.3790.4225

6,568,960

28-Jan-2008

10:40

IA-64

Soluzione alternativa

È possibile utilizzare uno dei seguenti metodi per risolvere questo problema. Si consiglia di utilizzare il metodo 1 perché la funzionalità di stored procedure estesa potrebbe essere rimossa nelle versioni future di SQL Server.

Metodo 1

  1. Utilizzare la stored procedure sp_OACreate per determinare le DLL caricate da SQL ServerSQL Server nel processo di SQL ServerSQL Server . A tale scopo, attenersi alla seguente procedura:

    1. Aprire SQL Profiler e quindi connettersi all'istanza di SQL Server.

    2. Nella finestra di dialogo Proprietà traccia specificare il nome della traccia, specificare il percorso in cui SQL Profiler salva la traccia e quindi fare clic su Esegui.

    3. Dopo aver eseguito SQL Profiler per qualche tempo, analizzare la traccia per individuare le occorrenze della sp_OACreate stored procedure.

    4. Si noti il primo parametro di ogni occorrenza della sp_OACreate stored procedure. Nota: Il primo parametro indica l'identificatore programmatico (ProgID) dell'oggetto OLE o l'identificatore di classe (CLSID) dell'oggetto OLE.

    5. Determinare la DLL che contiene questo oggetto OLE.

    Nota: È possibile utilizzare SQL Profiler per monitorare l'istanza di SQL Server quando si avvia il servizio SQL Server.

  2. Assicurarsi di aver attivato l'opzione Procedure di automazione OLE. Per ulteriori informazioni su come determinare se l'opzione Procedure di automazione OLE è attivata e come attivare l'opzione procedure di automazione OLE , visitare il seguente sito Web Microsoft Develop Network (MSDN):

    http://msdn2.microsoft.com/en-us/library/ms191188.aspx

  3. In SQL Server Management Studio di SQL Server 2008 R2, di SQL Server 2008 o di SQL Server 2005 o in SQL Query Analyzer di SQL Server 2000, eseguire le istruzioni seguenti. Nota:  Ad esempio, nel codice riportato di seguito viene illustrato come caricare il file 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

    Le istruzioni creano una stored procedure. Le istruzioni consentono inoltre l'esecuzione della stored procedure all'avvio del servizio SQL ServerSQL Server . Questa stored procedure esegue le operazioni seguenti:This stored procedure performs the following operations:

    • Carica il file Wbemdisp.dll.

    • Mantiene il file Wbemdisp.dll in memoria perché le istruzioni non vengono uscite.

    Finché il file Wbemdisp.dll è in memoria, altre istruzioni non caricano nuovamente il file Wbemdisp.dll. Pertanto, SQL Server non chiama la funzione TlsAlloc e la funzione TlsFree per il file Wbemdisp.dll. Nota: È necessario aggiornare il codice per caricare le DLL determinate nel passaggio 1.

  4. Aggiungere le istruzioni alla sp_Load_Dll stored procedure nel passaggio 3. Queste istruzioni caricano le DLL determinate nel passaggio 1.

  5. Riavviare il servizio SQL Server.

  6. Verificare che SQL Server carichi il file Wbemdisp.dll in memoria. A tale scopo, attenersi alla seguente procedura:

    1. Aprire il file di log degli errori di SQL Server.

    2. Cercare il seguente messaggio:

      wbemdisp.dll caricato nello spazio degli indirizzi SQL dalla procedura di avvio sp_Load_DllNota: Questo messaggio indica che SQL Server ha caricato il file Wbemdisp.dll.

    3. Al prompt dei comandi, eseguire il comando seguente:

      tasklist /m
    4. Nel risultato che si ottiene, individuare il processo Sqlservr.exe e quindi verificare che il file Wbemdisp.dll è elencato. Nota: Se il file Wbemdisp.dll è elencato, SQL Server ha caricato il file Wbemdisp.dll.

Metodo 2

  1. Utilizzare la stored procedure sp_OACreate per determinare le DLL caricate da SQL ServerSQL Server nel processo di SQL ServerSQL Server . A tale scopo, attenersi alla seguente procedura:

    1. Aprire SQL Profiler e quindi connettersi all'istanza di SQL Server.

    2. Nella finestra di dialogo Proprietà traccia specificare il nome della traccia, specificare il percorso in cui SQL Profiler salva la traccia e quindi fare clic su Esegui.

    3. Dopo aver eseguito SQL Profiler per qualche tempo, analizzare la traccia per individuare le occorrenze della sp_OACreate stored procedure.

    4. Si noti il primo parametro di ogni occorrenza della sp_OACreate stored procedure. Nota: Il primo parametro indica l'identificatore programmatico (ProgID) dell'oggetto OLE o l'identificatore di classe (CLSID) dell'oggetto OLE.

    5. Determinare la DLL che contiene questo oggetto OLE.

    Nota: È possibile utilizzare SQL Server ProfilerSQL Server Profiler per monitorare l'istanza di SQL ServerSQL Server quando si avvia il servizio SQL ServerSQL Server .

  2. Creare una stored procedure estesa. La stored procedure estesa contiene una funzione che carica le DLL determinate nel passaggio 1.

  3. Aggiungere la stored procedure estesa a SQL Server.

  4. In SQL ServerSQL Server usare la stored procedure di sistema sp_addextendedproc per registrare la funzione nella stored procedure estesa.

  5. Utilizzare la sp_procoption stored procedure per consentire l'avvio automatico della stored procedure estesa all'avvio del servizio SQL ServerSQL Server .

  6. Riavviare il servizio SQL Server.

Quando SQL Server esegue la funzione nella stored procedure estesa, SQL Server carica le DLL chiamando l'API LoadLibrary.

Stato

Questo non è un problema in SQL Server. Si tratta di un problema in Windows Server 2003 e Windows 2000. Questo problema non si verifica in Windows Vista o Windows Server 2008.

Riferimenti

Per ulteriori informazioni sulla funzione TlsAlloc, visitare il seguente sito Web Microsoft Developer Network (MSDN):

http://msdn2.microsoft.com/en-US/library/ms686801.aspxPer ulteriori informazioni sulla funzione TlsFree, visitare il seguente sito Web MSDN:

http://msdn2.microsoft.com/en-us/library/ms686804.aspxPer ulteriori informazioni sulla sp_OACreate stored procedure, visitare il seguente sito Web MSDN:

http://msdn2.microsoft.com/en-us/library/ms189763.aspx

Serve aiuto?

Amplia le tue competenze

Esplora i corsi di formazione >

Ottieni in anticipo le nuove caratteristiche

Partecipa a Microsoft Insider >

Queste informazioni sono risultate utili?

Come valuti la qualità della lingua?
Cosa ha influito sulla tua esperienza?

Grazie per il feedback!

×