pyodbc和insert语句

时间:2012-09-13 10:01:05

标签: pyodbc

我在很短的时间内使用pyodbc,现在面临从执行某些视图创建的文件应用sql脚本的问题。对于应用sql文件,我使用来自另一个线程的样本 - Follow up: Execute .sql files from python对于我的大多数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之间的块并应用它们。所以'插入TMP_VIEWS select * from TMP_QUERY_SQL'分别应用,然后其他部分。看起来像pyodbc或驱动程序实际上并不等待服务器上的插入完全执行,并且在执行插入操作之前执行第二个块。因此,我创建了相当随机的视图,并且在TMP_VIEWS中保留了非拼写查询。我有自动提交并尝试在查询执行后添加其他提交 - 这没有帮助。唯一有帮助的 - 在GO之间执行此批次之间添加time.sleep(0.2)。看起来像是一些异步调用。谁面临同样的问题或我的尝试可能出错?可能是一些解决方法?

谢谢!

1 个答案:

答案 0 :(得分:0)

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