2012-09-13 84 views
3

我使用pyodbc相当短的时间,现在面临从执行一些视图创建的文件中应用sql脚本的问题。对于采用SQL文件我用的样品从另一个线程 - Follow up: Execute .sql files from python有没有问题,大多数我的SQL脚本,但是这一个导致了一个问题:脚本的pyodbc和插入语句

部分:

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语句。所以按照我应用它的方式,它不起作用。来自另一个线程的示例将GO文件分为GO之间的块并应用它们。因此,'分别应用TMP_VIEWS select * from TMP_QUERY_SQL'和其他部分。它看起来像pyodbc或驱动程序实际上并没有等待服务器上的插入完全执行,并且第二个块在执行插入完成之前执行。因此,我在TMP_VIEWS中创建了非常随意的视图数量并且未创建查询。我有自动提交,并试图在查询执行后添加额外的提交 - 这没有帮助。唯一有用的 - 在GO之间添加time.sleep(0.2)执行此批处理。看起来像一些不同步的电话。谁面临同样的问题或者我的尝试可能会出错?可能是一些解决方法?

谢谢!

回答

0

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