2017-07-31 174 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