2012-01-19 12 views
0

以下のスクリプトを実行すると、この例外が発生します。それは約20分後にクラッシュした(+/-数分)。バッチを作成せずにこの例外を防止するにはどうすればよいですか?私はそれを必要とするすべてのクライアントレコードに対してこれを実行したい。SQL変換スクリプトによりSystem.OutOfMemoryExceptionが発生する

例外:

An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown. 

SQL変換スクリプト:私のコメントで述べた2つのストアドプロシージャで

SELECT clientid 
INTO #Temp 
FROM client 

DECLARE 
    @iteratorId INT, 
    @phone NVARCHAR(64), 
    @fax NVARCHAR(64), 
    @contactid INT 

WHILE (SELECT Count(*) FROM #Temp) > 0 
BEGIN 

    SELECT TOP 1 @iteratorId = clientid FROM #Temp 
    SET @contactid = NULL 

    --try and grab the first non null phone number in priority order 
    SET @phone = ISNULL((
     SELECT TOP 1 
      dayphone 
     FROM contact c 
     INNER JOIN dbo.clientcontact cc ON c.contactid = cc.contactid 
     WHERE 
      clientid = @iteratorId 
      AND cc.contacttypeid=2 
      AND c.dayphone IS NOT NULL 
     ORDER BY cc.parentclientcontactid, priority DESC 
    ),'') 

    --try and grab the first non null fax priority order 
    SET @fax = ISNULL((
     SELECT TOP 1 
      fax 
     FROM contact c 
     INNER JOIN dbo.clientcontact cc ON c.contactid = cc.contactid 
     WHERE 
      clientid = @iteratorId 
      AND cc.contacttypeid=2 
      AND c.fax IS NOT NULL 
     ORDER BY cc.parentclientcontactid, priority DESC 
    ),'') 

    IF NOT EXISTS(SELECT * FROM clientcontact WHERE [email protected] AND contacttypeid=3 AND priority=1) 
    BEGIN  
     INSERT INTO dbo.contact 
       (versionnumber , 
        createdate , 
        firstname , 
        lastname , 
        title , 
        middleinitial , 
        dayphone , 
        nightphone , 
        mobilephone , 
        fax , 
        securefax , 
        extranetusername , 
        extranetpassword , 
        email , 
        active , 
        testfaxpagereceived , 
        ftpoptionid , 
        testresultnotify 
       ) 
     VALUES (0 , -- versionnumber - int 
        GETDATE() , -- createdate - datetime 
        NULL , -- firstname - nvarchar(64) 
        NULL , -- lastname - nvarchar(64) 
        NULL , -- title - nvarchar(64) 
        NULL , -- middleinitial - nvarchar(64) 
        NULL , -- dayphone - nvarchar(64) 
        NULL , -- nightphone - nvarchar(64) 
        NULL , -- mobilephone - nvarchar(64) 
        NULL , -- fax - nvarchar(64) 
        '' , -- securefax - bit 
        NULL , -- extranetusername - nvarchar(64) 
        NULL , -- extranetpassword - nvarchar(64) 
        NULL , -- email - nvarchar(127) 
        0 , -- active - bit 
        0 , -- testfaxpagereceived - bit 
        NULL , -- ftpoptionid - int 
        NULL -- testresultnotify - bit 
       ) 
     SET @contactid = @@IDENTITY 

     EXEC dbo.procContactSave 
      @contactid = @contactid, -- int 
      @firstname = "General", -- nvarchar(64) 
      @middleinitial = NULL, -- nvarchar(64) 
      @nightphone = NULL, -- nvarchar(64) 
      @lastname = "Info", -- nvarchar(64) 
      @email = NULL, -- nvarchar(127) 
      @fax = @fax, -- nvarchar(64) 
      @testfaxpagereceived = 0, -- bit 
      @mobilephone = NULL, -- nvarchar(64) 
      @securefax = 0, -- bit 
      @active = 1, -- bit 
      @extranetpassword = NULL, -- nvarchar(64) 
      @extranetusername = NULL, -- nvarchar(64) 
      @title = NULL, -- nvarchar(64) 
      @ftpoptionid = NULL, -- int 
      @dayphone = @phone, -- nvarchar(64) 
      @testresultnotify = 0, -- bit 
      @audituserid = 0 -- int 

     EXEC dbo.procClientContactSave 
      @clientcontactid = NULL, -- int 
      @priority = 1, -- int 
      @clientid = @iteratorId, -- int 
      @contacttypeid = 3, -- int 
      @contactid = @contactid, -- int 
      @audituserid = 0 -- int 
    END 

    DELETE #Temp Where clientid = @iteratorId -- delete row so we don't loop over it again 
END 
DROP TABLE #Temp 
+1

'dbo.procContactSave'と' dbo.procClientContactSave'は何をしますか?CLR機能を使用しているのは何ですか? – Lucero

+0

ストアドプロシージャ.. INSERTコマンドを主に行う – MacGyver

+0

これらのストアドプロシージャは両方ともSQLウィンドウに1つの結果セットを出力します。 SSMSのメモリが不足していると思いますか? SQL Server 2008のメモリが不足するのは奇妙なことです。私はそれが1つのスクリプトで11,000レコードを処理できると思います。 – MacGyver

答えて

0

、私だけでなく、レコードを挿入し、標準的なWebアプリケーションのストアドプロシージャを呼び出しましたスクリプト内の各反復の結果セット(1レコードのみ)にそのレコードを戻しました。スクリプトは、2つのストアドプロシージャのSELECT文にコメントしたときに1.5分間実行されたので、SSMSがそれらの結果セットから表示していたデータの量からクラッシュしていたと思います。これは、メモリクラッシュを防ぎました。実行に要した時間の短縮(20分〜1.5分)はもちろんです。

関連する問題