2012-07-17 2 views
1

나는 xp_cmdshell을 통해 bcp를 사용하는 SQL Server 2008 저장 프로 시저에 대한 호출에서 보내는 간단한 파이썬 스크립트를 가지고 있습니다. 관리 콘솔을 통해 SP를 호출하면 정상적으로 작동합니다. 파이썬 스크립트에서 호출하면 실행이 bcp 결과에 사용 된 tempdb를 차단하므로 중단됩니다.파이썬 - 트랜잭션을 사용하지 않는 SQL 서버 호출

트랜잭션을 사용하지 않고 파이썬에서 전화를 걸 수있는 방법이 추가 추가 기능이 전화 끊기를 잠그는 것입니다.


import pyodbc as p 

def CallExportFiles(conn, procName): 
sql = "DECLARE @ret int EXEC @ret = [db].[dbo].[" + procName + "] @I_EMAILPROFILE = N\'SQL_AlertProfile\', @I_EMAILALERTS = N\'[email protected]\', @I_CUSTOMERID = N\'xxx\', @I_ENVIRO = N\'prod\', @I_COAFILENAME = N\'InvoiceGL\', @I_PERSONFILENAME = N\'Person\', @I_DELEGATESFILENAME = N\'Delegates\', @I_VENDORFILENAME = N\'InvoiceVendors\', @I_DIRECTORY = N\'\\\\xxx\\output\\yyy\\\', @I_ARCHIVEDIR = N\'\\\\xxx\\output\\yyy\\ARCHIVE\\\', @I_FAILUREDIR = N\'\\\\xxx\\output\\yyy\\FAILURE\\\' SELECT \'Return Value\' = @ret" 
dbCursor = conn.cursor() 
##Locks on this next execute call 
dbCursor.execute(sql) 
dbCursor.commit() 


if __name__ == '__main__': 
#connectin to the db with SQL Authentification 
conn = p.connect(driver = '{SQL Server Native Client 10.0}', server = r'server', database = 'db', uid = 'sa', pwd = 'xxx') 

if (conn == False): 
    print 'Error, did not connect to the database' 
else: 
    CallExportFiles(conn, 'sp_export_files') 

conn.close() 

여기에 실행 (참고에 저장된 프로 시저 호출 할 때까지 고정입니다 조각 :이 저장된 프로 시저가 미세 승 /라는 작품을 여기에

내 스크립트입니다 관리 Studio에서 동일한 문자열 :


SELECT CONVERT(varchar(1),'Z') AS [SORT], 
CONVERT(varchar(64),'GLNumber') AS GLNUMBER, 
CONVERT(varchar(1000),'GLDescription') AS GLDESCRIPTION, 
CONVERT(varchar(4),'Type') AS [TYPE], 
CONVERT(varchar(100),'GLStatusFlag') AS GLSTATUSFLAG, 
CONVERT(varchar(100),'UDF1') AS UDF1, 
CONVERT(varchar(100),'UDF2') AS UDF2, 
CONVERT(varchar(100),'UDF3') AS UDF3, 
CONVERT(varchar(100),'UDF4') AS UDF4, 
CONVERT(varchar(100),'UDF5') AS UDF5 
INTO ##BCP_Results1 

INSERT INTO ##BCP_Results1([SORT],GLNUMBER,GLDESCRIPTION,[TYPE],GLSTATUSFLAG,UDF1,UDF2,UDF3,UDF4,UDF5) 
SELECT 'A', 
GLNUMBER, 
GLDESCRIPTION, 
[TYPE], 
GLSTATUSFLAG, 
UDF1, 
UDF2, 
UDF3, 
UDF4, 
UDF5 
FROM dbname.DBO.GLACCOUNTS 

set @sqlstring = 'bcp "SELECT GLNUMBER,GLDESCRIPTION,[TYPE],GLSTATUSFLAG,UDF1,UDF2,UDF3,UDF4,UDF5 FROM ##BCP_Results1 ORDER BY [SORT] DESC " queryout '[email protected][email protected]_COAFILENAME+'-'[email protected]_ENVIRO+'-'[email protected]_CUSTOMERID+'-'+CONVERT(CHAR(10),GETDATE(),23)+'-'+ LEFT(CONVERT(CHAR(5),GETDATE(),114),2)+'-'+ RIGHT(CONVERT(CHAR(5),GETDATE(),114),2)+'.txt -c -t^| -U sa -P xxxx -S xserverx\xdbx' 
EXECUTE master.dbo.xp_cmdshell @sqlstring 
drop table ##BCP_Results1 

+0

뭔가가 트랜잭션을 시작하는 것처럼 확실히 냄새가납니다. [autocommit] (http://code.google.com/p/pyodbc/wiki/FAQs#Connecting_fails_with_an_error_about_SQL_ATTR_AUTOCOMMIT) 속성을 사용하면 어떨까요? 프로세스가 걸려있을 때 관리 스튜디오에서 블록 (sp_who2)을 보시겠습니까? 교착 상태에 빠졌습니까? – billinkc

+0

자동 커밋을 시도해 보겠습니다. 자동 커밋을 사용하면 몇 가지 방법이 있습니다. 그것이 멈 추면, sp_who2는 내 컴퓨터에서 실행 가능한 EXECUTE를 보여줍니다. 파이썬 스크립트는 마스터에서 SELECT를 차단하고 있습니다 (bcp가 꺼져 있다는 가정하에). 또한, 프로세스를 죽일 때까지 tempdb의 아무 것도 액세스 할 수 없습니다 – Steve

+0

하! 그게 효과가 있었어. 자동 커밋이 내 이슈를 고쳤습니다. 빌 링크! – Steve

답변