Sql server 2008 使用SQL Server上的pyodbc,使用select*从openrowset(BULK…)创建表不会产生任何效果
环境:Windows 64位、python 2.7.8(32位)、pyodbc v。3.0.7 对于我需要做的事情,我不能按照内部策略使用LinkedServer 使用python,我试图:Sql server 2008 使用SQL Server上的pyodbc,使用select*从openrowset(BULK…)创建表不会产生任何效果,sql-server-2008,python-2.7,sql-server-2012,pyodbc,openrowset,Sql Server 2008,Python 2.7,Sql Server 2012,Pyodbc,Openrowset,环境:Windows 64位、python 2.7.8(32位)、pyodbc v。3.0.7 对于我需要做的事情,我不能按照内部策略使用LinkedServer 使用python,我试图: 导出表的数据(*.dat)及其结构(格式-*.fmt) 从一台Sql Server(2008或2012)使用bcp。出口 文件放在我的本地机器上。我打了两个BCP电话:一个是为了得到 格式化(.fmt)文件,另一个用于获取数据(.dat)的文件(无法 找到一种方法,一步完成这两项工作) 将给定表的数据导入到
sql = "select * into %s from
openrowset(BULK '\\\\%s\\sqltemp\\%s.dat',
FORMATFILE = '\\\\%s\\sqltemp\%s.fmt') as A" %(newTableName,os.environ['COMPUTERNAME'],
table,os.environ['COMPUTERNAME'],table)
最终看起来像:
select A.* into MyDatabase.dbo.blah48 from
openrowset(BULK '\\MyMachineName\DedicatedShareFolder\table.dat',
FORMATFILE = '\\MyMachineName\DedicatedShareFolder\table.fmt') as A;
我创建了与具有MyDatabase的SQL server的连接,并执行:
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s' % (server, catalog, login, pw))
cursor = cnxn.cursor()
rows = cursor.execute(sql).rowcount
print "Done importing %s rows" %rows
我得到:
Done importing 606597 rows
唉,这个表还没有创建
我使用“ODBC数据源管理”的“跟踪”选项卡在本地计算机上运行了跟踪。我打开了日志文件,找不到与创建表有关的任何错误。我确实看到这样的条目:
test_DB 5200-5a28 EXIT SQLDriverConnectW with return code 1 (SQL_SUCCESS_WITH_INFO)
HDBC 0x03C59190
HWND 0x00000000
WCHAR * 0x74C28B34 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x74C28B34 <Invalid buffer length!> [-3]
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
DIAG [01000] [Microsoft][ODBC SQL Server Driver][SQL Server]Changed database context to 'mydatabase'. (5701)
DIAG [01000] [Microsoft][ODBC SQL Server Driver][SQL Server]Changed language setting to us_english. (5703)
DIAG [01S00] [Microsoft][ODBC SQL Server Driver]Invalid connection string attribute (0)
test_DB 50c0-4fec EXIT SQLGetTypeInfo with return code -1 (SQL_ERROR)
HSTMT 0x03AC8E80
SWORD 12 <SQL_VARCHAR>
DIAG [24000] [Microsoft][ODBC Driver Manager] Invalid cursor state (0)
跟踪文件指示已创建表。唉,事实并非如此
出于绝望,我查看了正在测试的服务器上的每个数据库。尽管MyDatabase是我唯一拥有写权限的数据库,但任何地方都没有空表
如果我在Microsoft SQL Server Management Studio中执行相同的“select*into…openrowset…bulk…”语句,它将成功(以python脚本中使用的同一用户身份登录)
我使用同一脚本中的函数成功地执行许多其他与SQL相关的任务。导入是唯一不起作用的东西
我还运行了我能想到的每一个负单元测试,以确保没有变量在中途被更改。没什么
我是python的初学者。我要么在代码中犯了严重错误,要么
如果无法使用“select*into..openrowset etc”类型的语句来实现我的目标,那么我可以使用什么其他SLQ解决方案来创建表并基于其BCP dat和fmt文件加载其数据
谢谢。默认情况下,对象中禁用事务的自动提交。您请求的所有工作实际上都已完成,事务只是在连接关闭时回滚 两个选项:
Cursor.commit()
,因此无需跟上连接
对象autocommit
变量设置为True
。请注意,它是函数的参数,它不是连接字符串的一部分。使用您的编码样式设置autocommit
:
....
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s' % (server, catalog, login, pw),
autocommit=True)
....
....
cnxn=pyodbc.connect('DRIVER={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s%%(服务器,目录,登录,pw),
自动提交=真)
....