2012-07-17 59 views
1

我有一个简单的Python脚本,我将调用发送到SQL Server 2008存储过程,然后通过xp_cmdshell使用bcp。当我通过管理控制台调用SP时,它工作得很好。当我从python脚本调用它时,它会随着执行阻止用于bcp结果的tempdb而挂起。Python - SQL Server调用不使用事务

有没有一种方法可以在不使用事务的情况下从Python进行调用(因为我认为这个附加组件锁定了我的调用挂起)。

这里是我的脚本:


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() 

在存储过程调用时锁定了是在执行此处(注意这件作品:此存储过程工作正常称为瓦特/从Management 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 2012-07-17 19:51:20

+0

我会尝试autocommit,看看它是如何处理它在这里几个。当它挂起时,sp_who2显示可从我的机器运行的EXECUTE,并且Python脚本阻塞了主设备上的SELECT(假定bcp正在关闭)。此外,tempdb中的任何内容都不可访问,直到我终止进程 – Steve 2012-07-17 20:03:32

+0

Ha!这工作。 Autocommit解决了我的问题,谢谢billinkc! – Steve 2012-07-17 20:10:14

回答