Update: Wenn Sie TRANSACTSQL Cursor-Variablen, verwenden für Operationen, die über große Iterationen verfügen, können Speicherverluste in SQL Server 2000 auftreten

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 837957 - Produkte anzeigen, auf die sich dieser Artikel bezieht
# Fehler: 471233 (SQL Server 8.0)


Microsoft stellt Updates für SQL Server 2000 als downloadbare Datei. Da die Updates kumulativ sind, enthält jede neue Version alle Hotfixes und alle Softwareupdates, die mit früheren SQL Server 2000-Update enthalten waren.
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn Sie TRANSACTSQL Cursor-Variablen, verwenden für Operationen, die über große Iterationen verfügen, stellen Sie möglicherweise das folgende Verhalten fest:
  • Der Client, der die Operationen auf dem Computer ausführt, auf dem SQL Server ausgeführt wird möglicherweise Out Speicherfehler zurück, die den folgenden ähneln:

    Fehlermeldung 1

    Msg 701: Es ist genügend Speicher zum Ausführen dieser Abfrage.
    Fehlermeldung 2

    Msg 1204: Der SQL Server kann keine LOCK-Ressource zu diesem Zeitpunkt erhalten. Führen Sie die Anweisung erneut aus, sobald weniger Benutzer aktiv sind, oder bitten Sie den Systemadministrator überprüfen Sie die SQL Server-Sperren und Speicher-Konfiguration.
    Fehlermeldung 3

    Msg 17803: Nicht genügend Arbeitsspeicher verfügbar.
  • Die Antwort von dem Computer mit SQL Server 2000 kann langsamer werden.
  • Die DBCC FREEPROCCACHE Transact-SQL-Anweisung möglicherweise nicht den Speicher frei oder möglicherweise nicht den Prozedurcache löschen. Dieses Verhalten kann auftreten, selbst wenn der Client vom Computer getrennt wird, auf dem SQL Server ausgeführt wird.

Ursache

Dieses Verhalten, weil die durch die Cursorvariable verwendeten Ressourcen nicht freigegeben werden.

Abhilfe

Um dieses Problem zu umgehen, müssen Sie die Ressourcen freigeben, die die Cursorvariablen zugewiesen werden. Dazu müssen Sie die folgenden sicherstellen:
  • Wenn Sie eine Transact-SQL SET-Anweisung, verwenden eine Cursorvariable festgelegt, müssen Sie eine Transact-SQL DEALLOCATE-Anweisung verwenden, um Ressourcen freizugeben, die von den Cursor verwendet werden, wenn der Cursor nicht mehr erforderlich ist.
  • Wenn Sie eine OPEN-Transact-SQL-Anweisung, verwenden um eine Cursorvariable zu öffnen, müssen Sie eine CLOSE Transact-SQL-Anweisung verwenden, um Ressourcen freizugeben, die von den Cursor verwendet werden, wenn der Cursor nicht mehr erforderlich ist.

Lösung

Informationen zu Service Packs

Installieren Sie das neueste Service Pack für Microsoft SQL Server 2000, um dieses Problem zu beheben. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
290211So erhalten Sie das neueste Service Pack für SQL Server 2000

Hotfix-Informationen

Die englische Version dieses Updates weist die in der nachstehenden Tabelle aufgelisteten Dateiattribute (oder höher) auf. Die Datums- und Uhrzeitangaben für diese Dateien werden in Coordinated Universal Time () angegeben. Wenn Sie sich die Dateiinformationen ansehen, werden diese Angaben in die lokale Zeit konvertiert. Um die Differenz zwischen UTC und der Ortszeit zu ermitteln verwenden Sie die Registerkarte Zeitzone des Tools ? Datum und Uhrzeit in der Systemsteuerung.
   Date         Time   Version            Size    File name
   --------------------------------------------------------------------
   31-May-2003  05:15  2000.80.818.0      78,400  Console.exe      
   27-Oct-2003  14:51  2000.80.873.0     315,968  Custtask.dll     
   30-Jan-2004  02:59  2000.80.911.0      33,340  Dbmslpcn.dll     
   24-Apr-2003  12:42                    786,432  Distmdl.ldf
   24-Apr-2003  12:42                  2,359,296  Distmdl.mdf
   29-Jan-2003  12:25                        180  Drop_repl_hotfix.sql
   11-Sep-2003  13:56  2000.80.859.0   1,905,216  Dtspkg.dll       
   26-Aug-2003  06:46  2000.80.854.0     528,960  Dtspump.dll      
   23-Jun-2003  09:10  2000.80.837.0   1,557,052  Dtsui.dll        
   23-Jun-2003  09:10  2000.80.837.0     639,552  Dtswiz.dll       
   23-Apr-2003  13:21                    747,927  Instdist.sql
   02-May-2003  12:26                      1,581  Inst_repl_hotfix.sql
   30-Jan-2004  02:59  2000.80.911.0      90,692  Msgprox.dll      
   31-Mar-2003  12:37                      1,873  Odsole.sql
   30-Jan-2004  02:59  2000.80.911.0      62,024  Odsole70.dll     
   30-Jan-2004  02:59  2000.80.911.0      25,144  Opends60.dll     
   30-Jan-2004  02:59  2000.80.911.0      57,904  Osql.exe         
   02-Apr-2003  09:45  2000.80.797.0     279,104  Pfutil80.dll     
   04-Aug-2003  04:47                    550,780  Procsyst.sql
   11-Sep-2003  11:07                     12,305  Qfe469315.sql
   22-May-2003  09:27                     19,195  Qfe469571.sql
   29-Jan-2004  11:47                  1,090,380  Replmerg.sql
   30-Jan-2004  02:59  2000.80.911.0     221,768  Replprov.dll     
   30-Jan-2004  02:59  2000.80.911.0     307,784  Replrec.dll      
   29-Jan-2004  09:54  2000.80.911.0     159,813  Replres.rll
   05-Sep-2003  10:30                  1,087,150  Replsys.sql
   13-Aug-2003  02:58                    986,603  Repltran.sql
   30-Jan-2004  02:59  2000.80.911.0     287,304  Rinitcom.dll     
   30-Jan-2004  02:59  2000.80.911.0      57,916  Semnt.dll        
   29-Jul-2003  06:43  2000.80.819.0     492,096  Semobj.dll       
   31-May-2003  04:57  2000.80.818.0     172,032  Semobj.rll
   02-Jan-2004  06:12  2000.80.904.0      53,832  Snapshot.exe     
   09-Dec-2003  06:37                    117,834  Sp3_serv_uni.sql
   04-Feb-2004  11:16  2000.80.913.0      28,672  Sqlagent.dll     
   04-Feb-2004  11:17  2000.80.913.0     311,872  Sqlagent.exe     
   19-Feb-2004  04:32  2000.80.916.0     168,001  Sqlakw32.dll     
   30-Jan-2004  02:59  2000.80.911.0   4,215,360  Sqldmo.dll       
   07-Apr-2003  04:14                     25,172  Sqldumper.exe    
   29-Jan-2004  09:47  2000.80.911.0      28,672  Sqlevn70.rll
   30-Jan-2004  02:59  2000.80.911.0     180,792  Sqlmap70.dll     
   02-Sep-2003  13:26  2000.80.857.0     188,992  Sqlmmc.dll       
   02-Sep-2003  09:33  2000.80.857.0     479,232  Sqlmmc.rll
   21-Oct-2003  10:38  2000.80.871.0     401,984  Sqlqry.dll       
   30-Jan-2004  02:59  2000.80.911.0      57,920  Sqlrepss.dll     
   01-Mar-2004  10:33  2000.80.919.0   7,618,641  Sqlservr.exe     
   30-Jan-2004  02:59  2000.80.911.0     590,396  Sqlsort.dll      
   30-Jan-2004  02:59  2000.80.911.0      45,644  Sqlvdi.dll       
   30-Jan-2004  02:59  2000.80.911.0     106,588  Sqsrvres.dll     
   30-Jan-2004  02:59  2000.80.911.0      33,340  Ssmslpcn.dll     
   30-Jan-2004  02:59  2000.80.911.0      82,492  Ssnetlib.dll     
   30-Jan-2004  02:59  2000.80.911.0      25,148  Ssnmpn70.dll     
   27-Oct-2003  14:51  2000.80.873.0     123,456  Stardds.dll      
   30-Jan-2004  02:59  2000.80.911.0     158,240  Svrnetcn.dll     
   30-Jan-2004  02:59  2000.80.911.0      76,416  Svrnetcn.exe     
   30-Apr-2003  10:22  2000.80.816.0      45,132  Ums.dll          
   30-Jan-2004  02:59  2000.80.911.0      98,872  Xpweb70.dll      
Hinweis aufgrund der Dateiabhängigkeiten, neueste Hotfix oder Feature, das diese Dateien enthält möglicherweise auch weitere Dateien enthalten.

Status

Microsoft hat bestätigt, dass dies ein Problem in den Microsoft-Produkten ist, die im Abschnitt "Gilt für" dieses Artikels aufgeführt sind.

Dieses Problem wurde erstmals im Microsoft SQL Server 2000 Service Pack 4.

Weitere Informationen

Dieses Verhalten, das im Abschnitt "Problembeschreibung" erwähnte tritt auf, wenn Sie eine Cursorvariable und die Sie wiederverwenden derselben Cursorvariablen ohne Freigeben von Ressourcen, die von der Cursorvariablen verwendet werden. Betrachten Sie beispielsweise die folgende gespeicherte Prozedur:
CREATE PROCEDURE MYPROC
BEGIN

    DECLARE @CURSOR CURSOR
    SET @CURSOR = CURSOR FOR SELECT * FROM AUTHORS     -- FIRST ASSIGNMENT (THIS ASSIGNMENT LEAKS WHEN A SECOND ASSIGNMENT TAKES PLACE WITHOUT DEALLOCATION)
    
    --Other Transact-SQL statements
    
    SET @CURSOR = CURSOR FOR SELECT * FROM AUTHORS    --  SECOND ASSIGNMENT
    
    --Other Transact-SQL statements

END

Wenn Sie diese gespeicherte Prozedur ausführen, wird möglicherweise die mangelndem Speicher-Fehlermeldungen angezeigt. Um das Problem zu beheben, müssen Sie den Code gespeicherte Prozedur wie folgt ändern:
CREATE PROCEDURE MYPROC
BEGIN

    DECLARE @CURSOR CURSOR
    SET @CURSOR = CURSOR FOR SELECT * FROM AUTHORS     -- FIRST ASSIGNMENT

    --Other Transact-SQL statements

    DEALLOCATE @CURSOR --DEALLOCATING THE CURSOR VARIABLE BEFORE A SECOND ASSIGNMENT

    SET @CURSOR = CURSOR FOR SELECT * FROM AUTHORS    --  SECOND ASSIGNMENT

    --Other Transact-SQL statements

    DEALLOCATE @CURSOR --DEALLOCATING THE CURSOR VARIABLE THAT WAS ASSIGNED SECOND

END

Informationsquellen

Weitere Informationen über Softwareupdates finden Sie die folgende KB-Artikelnummer:
824684Erläuterung von Standardbegriffen bei Microsoft Softwareupdates
Weitere Informationen über Speicher finden Sie verwandte Probleme die folgenden Artikelnummern, um die Artikel der Microsoft Knowledge Base:
810052Update: Ein Speicherverlust tritt auf, wenn Cursors während einer Verbindung geöffnet werden
818095Update: Cursor-Pläne werden nicht aus dem Cache entfernt, wenn virtueller Speicher deplete
820773Update: JDBC-Treibers Speicherverluste Servercursor
271624Info: MEMORYSTATUS DBCC zum Überwachen der Arbeitsspeicherverwendung von SQL Server verwenden

Eigenschaften

Artikel-ID: 837957 - Geändert am: Freitag, 2. November 2007 - Version: 3.3
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition 64-bit
Keywords: 
kbmt kbhotfixserver kbqfe kbqfe kbtsql kbsqlprog kbquery kberrmsg kbmemory kbsqlserv2000presp4fix kbfix kbbug KB837957 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 837957
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com