2017-07-31 328 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秒不足以完成您的代碼,只需將此執行超時值更改爲其他(0 =無限)

+0

謝謝,但我已經優化了我的查詢,所以它不超過30秒 – gray

+0

你的更新可以被任何SELECT阻塞,你可以看到誰在sys.dm_os_waiting_tasks中阻止它 – sepupic