3

我使用 pyodbc 的时间很短,现在面临从执行一些视图创建的文件应用 sql 脚本的问题。为了应用 sql 文件,我使用来自另一个线程的示例 -跟进:从 python 执行 .sql 文件 我的大多数 sql 脚本都没有问题,但这会导致问题:

脚本的一部分:

insert into TMP_VIEWS select * from TMP_QUERY_SQL
go
begin
declare @SQL_CMD varchar(4000);
declare @CNT int;
set @CNT = (select count(1) from TMP_VIEWS);
while @CNT > 0
begin 
  set @SQL_CMD = (select top 1 SQL_CMD from TMP_VIEWS order by SQL_CMD);
  print 'Executing: ' + @SQL_CMD;
  EXEC(@SQL_CMD)
  delete from TMP_VIEWS where @SQL_CMD = SQL_CMD;
  set @CNT = (select count(1) from TMP_VIEWS);
end
end

如您所见,它执行从另一个表插入到表中的 SQL 语句。所以在我应用它的方式上它不起作用。来自另一个线程的样本将 sql 文件分成 GO 之间的块并应用它们。所以'insert into TMP_VIEWS select * from TMP_QUERY_SQL'分别应用,然后是其他部分。看起来 pyodbc 或驱动程序实际上并没有等待服务器上完全执行插入,而是在实际插入完成之前执行第二个块。结果,我在 TMP_VIEWS 中创建了相当数量的视图,而未创建的查询仍然存在。我有自动提交并尝试在查询执行后添加额外的提交 - 这没有帮助。唯一有帮助的 - 在 GO 之间执行此批次之间添加 time.sleep(0.2)。看起来像一些异步调用。谁面临同样的问题或我的尝试可能有什么问题?可能有一些解决方法?

谢谢!

4

1 回答 1

0

如果您只需要此特定脚本的解决方案,请执行以下操作:将 TMP_QUERY_SQL 表中的所有 SQL 语句读入 Python 列表。然后excecute在遍历列表时调用每个语句,并避免对临时 SQL 表 TMP_VIEWS 的任何依赖。

于 2015-10-10T14:48:35.553 回答