我正在尝试使用包含大量GO语句的脚本更新MS SQL Server数据库。在我的开发机器上,这工作正常,脚本在大约2.5分钟内完成并完成应该做的事情,但在我的笔记本电脑上我得到了超时。它发生在脚本的一部分(批处理?),在我的开发机器上需要29秒,所以我的猜测是我的笔记本电脑需要超过60秒。我在脚本的那部分工作的表有大约600 000行。
但我在代码中设置了1800秒超时,在连接字符串中设置了1800秒(连接超时= 1800)。 1800这个数字并不重要,我刚刚将它提升到一个巨大的数字,看看是否有助于这种情况。在我看来,单个批次的超时仍然是60秒?以下是执行脚本的代码:
SqlConnection connection = new SqlConnection(_login.ConnectionString);
Server server = new Server(new ServerConnection(connection));
server.ConnectionContext.StatementTimeout = 1800;
server.ConnectionContext.ExecuteNonQuery(script);
这是我得到的错误:
EXECUTE_ERROR:An exception occurred while executing a Transact-SQL statement or batch.
EXECUTE_ERROR:Timeout uppstod innan åtgärden slutfördes eller servern svarar inte.
第二部分是瑞典语,大致转换为:在操作完成或服务器没有响应之前发生超时。
有什么想法吗?
修改:
尝试了以下代码,但结果是相同的......
Server server = new Server();
server.ConnectionContext.ConnectionString = _login.ConnectionString;
server.ConnectionContext.Connect();
server.ConnectionContext.StatementTimeout = 1800;
server.ConnectionContext.ExecuteNonQuery(script);
编辑2:
好的,现在我至少知道Sql Server存在问题的地方。我不知道为什么,因为这个SQL在我的开发机器上工作正常,并在大约5秒内执行。在我的笔记本电脑上,使用更快的硬盘,它几乎挂起。我没有耐心看看为笔记本电脑完成它需要多长时间。我知道最初的问题是关于超时,我仍然需要解决这个问题,但这更重要。这批产品如何在笔记本电脑上花费更多时间?有什么想法吗?
DECLARE @TaskId Int
DECLARE @CreatedById Int
DECLARE @CreatedAt DateTime2
DECLARE @AssignedToId int
DECLARE @AssignedById int
DECLARE @AssignedAt DateTime2
DECLARE @Count Int
SELECT @Count=1
DECLARE TaskLog_Cursor CURSOR FOR
SELECT Id, CreatedById, CreatedAt, AssignedToId, AssignedById, AssignedAt FROM Task
OPEN TaskLog_Cursor;
FETCH NEXT FROM TaskLog_Cursor INTO @TaskId, @CreatedById, @CreatedAt, @AssignedToId, @AssignedById, @AssignedAt
WHILE @@FETCH_STATUS = 0
BEGIN
-- Created by logs
INSERT INTO TaskLog (Id, TaskId, CreatedById, CreatedAt) VALUES(@Count, @TaskId, @CreatedById, @CreatedAt)
INSERT INTO TaskLogDetail (Id, TaskLogId, TaskLogActionId) VALUES (@Count, @Count, 0)
SELECT @Count=@Count + 1
-- Assigned to logs
if (not @AssignedToId is null AND not @AssignedById is null AND not @AssignedAt is null)
begin
INSERT INTO TaskLog (Id, TaskId, CreatedById, CreatedAt) VALUES(@Count, @TaskId, @AssignedById, @AssignedAt)
INSERT INTO TaskLogDetail (Id, TaskLogId, TaskLogActionId, FromId, ToId) VALUES (@Count, @Count, 8, null, @AssignedToId)
SELECT @Count=@Count + 1
end
FETCH NEXT FROM TaskLog_Cursor INTO @TaskId, @CreatedById, @CreatedAt, @AssignedToId, @AssignedById, @AssignedAt
END;
CLOSE TaskLog_Cursor;
DEALLOCATE TaskLog_Cursor;
GO