基本上 SQL Server 只要在处理大量数据的指令,如 INSERT INTO A SELECT * FROM B 在数据量很大的时候,很容易发生 Timeout ,也就是常见的「逾期过时」错误。
SQL Server 本机用 Enterprise Manager 执行的话还好处理,只要更改设定值就好了。(工具->选项->进阶,加大逾时秒数)。
但是绝大部份都是在 Remote 下 SQL Command ,只要量稍大,这种「逾期过时」出现的机率也随之增加。
解决的方式最好是加大 SQL Server Remote Command 的 Timeout 时间,只要在 SQL Queryer 里面下:
USE master
GO
EXEC sp_configure 'remote query timeout', 6000
GO
RECONFIGURE
GO
6000 代表的是秒数,也就是 6000 秒(SQL Server预设是 600 秒,)。
另一种就是用外部程序来处理,但是可能还是会受限于 SQL Server 的限制,尤其 ADODB 在这部份还有严重的Bug,详见:
PRB: CommandTimeout Does Not Inherit From Connection Timeout
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q195489
程序设定 CommandTimeout 处理的范例:
Dim conn As New ADODB.Connection
conn.Open(ConnStr)
conn.CommandTimeout = 600 '秒
conn.Execute("INSERT INTO A SELECT * FROM B")
conn.Close()
conn = Nothing
需注意的是在 ADODB 2.6 以前,CommandTimeout 不可以设为 0 (无限制时间),非不得以要使用的话,必须使用 ADODB.Command,详见:
FIX:使用 Connection 对象时的 CommandTimout 属性问题
http://support.microsoft.com/default.aspx?scid=kb;zh-tw;175264