【问题标题】:pyodbc and insert statementspyodbc 和插入语句
【发布时间】:2012-09-06 09:28:52
【问题描述】:

我使用 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 之间的块并应用它们。所以'insert into TMP_VIEWS select * from TMP_QUERY_SQL'分别应用,然后是其他部分。看起来 pyodbc 或驱动程序实际上并没有等待服务器上完全执行插入,而是在实际插入完成之前执行第二个块。结果,我在 TMP_VIEWS 中创建了相当数量的随机视图和未创建的查询。我有自动提交并尝试在查询执行后添加额外的提交 - 这没有帮助。唯一有帮助的 - 在 GO 之间执行此批次之间添加 time.sleep(0.2)。看起来像一些异步调用。谁面临同样的问题或我的尝试可能有什么问题?可能有一些解决方法?

谢谢!

【问题讨论】:

    标签: pyodbc


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      相关资源
      最近更新 更多