2017-07-31 8 views
0

私のコードに何か問題がありますか?私は例外を受け取ります:SQL Serverの実行タイムアウトが満了しました

実行時間が切れました。操作が完了する前にタイムアウト時間が経過したか、サーバーが応答していません。

私は、ユーザー

ALTER PROCEDURE SP_UPDATE_FACILITY 
    @featid int, 
    @facilityid int, 
    @updatetbl as TABLE_UPDATE_FACILITYDETAILS READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @tblname AS NVARCHAR(255); 
    SET @tblname = (SELECT dbo.FNC_Search_GetSearchTable(@facilityid)); 

    DECLARE @key varchar(255); 
    DECLARE @value varchar(255); 

    DECLARE @MyCursor CURSOR 

    SET @MyCursor = CURSOR FOR 
     SELECT col_key, col_value FROM @updatetbl 

    OPEN @MyCursor 

    FETCH NEXT FROM @MyCursor INTO @key , @value 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF(@key != '' and @value != '') 
     BEGIN 
      BEGIN TRY 
       SET @value = (CAST (@value AS varchar(255))); 
      END TRY 
      BEGIN CATCH 
       SET @value = (CAST (@value AS float)); 
      END CATCH; 

      DECLARE @sSQL NVARCHAR(500); 
      SET @sSQL = 'UPDATE ' + QUOTENAME(@tblname) + ' SET ' + QUOTENAME(@key) + ' = @value WHERE FEATID = @featid' 

      EXEC sp_executesql @sSQL , N'@value VARCHAR(255), @featid INT', @key, @featid 

      FETCH NEXT FROM @MyCursor INTO @key, @value 
     END 
    END; 

    CLOSE @MyCursor ; 
    DEALLOCATE @MyCursor; 
END 
GO 

の検索機能に応じて、動的な列と動的テーブルを更新しようとしているテーブルの行をループする方法はあります、テーブルの行ごとの値を取得

+1

サイドノート: **ではなく**あなたのストアドプロシージャのために 'sp_'プレフィックスを使います。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx)、およびあなたはいつか名前衝突のリスクを将来実行します。 [ストアドプロシージャのパフォーマンスにも悪い](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)単に 'sp_'を避け、他の何かを接頭辞として使うのが最善です。 –

+0

@Valueは既にvarchar(255)ですが、なぜそれをvarchar(255)にキャストしますか? 列ごとに更新ステートメントを使用する代わりに、すべての列を一度に更新することができます。 – Peter

答えて

2

SQL Serverには「実行のタイムアウト」はありませんが、クライアントはそれを設定できます。

C#を使用する場合、既定の実行タイムアウトは30秒ですが、それは小さすぎます。 質問がsys.dm_os_waiting_tasksを使用して待っているかどうか調べる必要がありますが、30秒でコードが完了しない場合は、この実行タイムアウト値をsmth else(0 =無限)に変更してください。

+0

ありがとうございますが、私は既に30秒を超えないようにクエリを最適化しました – gray

+0

あなたのアップデートはSELECTによってブロックされ、誰がsys.dm_os_waiting_tasksをブロックするかを見ることができます – sepupic

関連する問題