2012-09-13 3 views
3

저는 pyodbc를 매우 짧은 기간 사용하고 있으며 일부보기 생성을 수행하는 파일에서 SQL 스크립트를 적용하는 문제에 직면했습니다. SQL 파일을 적용하는 동안 나는 다른 스레드에서 샘플을 사용 - Follow up: Execute .sql files from python 내 SQL 스크립트의 대부분에 아무런 문제가 없다 그러나 이것은 문제의 원인 : 스크립트의pyodbc 및 insert 문

부분 : 보시다시피

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처럼 보입니다. 또는 드라이버는 실제로 서버에 insert의 전체 실행을 기다리지 않고 actuall insert가 comlete되기 전에 두 번째 블록이 실행됩니다. 결과적으로 나는 무작위로 생성 된 뷰를 생성하고 TMP_VIEWS에는 비 한정 쿼리가 남아있게됩니다. 나는 자동 커밋을하고 쿼리 실행 후 추가 커밋을 추가하려고 시도했다. 도움이되는 유일한 방법은 GO 사이에이 일괄 처리를 실행하려면 time.sleep (0.2)를 추가하는 것입니다. 비동기 호출처럼 보입니다. 같은 문제에 직면 한 사람이나 시도에서 잘못되었을 수있는 사람은 누구입니까? 몇 가지 해결 방법이있을 수 있습니까?

감사합니다.

답변

0

이 특정 스크립트에 대한 솔루션 만 있으면 다음을 수행하십시오. TMP_QUERY_SQL 테이블의 모든 SQL 문을 파이썬 목록으로 읽으십시오. 그런 다음 목록을 반복하면서 각 명령문에 excecute을 호출하고 임시 SQL 테이블 TMP_VIEWS에 대한 종속성을 피하십시오.