Sql server 2008 使用SQL Server上的pyodbc,使用select*从openrowset(BULK…)创建表不会产生任何效果

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)的文件(无法 找到一种方法,一步完成这两项工作) 将给定表的数据导入到

环境:Windows 64位、python 2.7.8(32位)、pyodbc v。3.0.7

对于我需要做的事情,我不能按照内部策略使用LinkedServer

使用python,我试图:

  • 导出表的数据(*.dat)及其结构(格式-*.fmt) 从一台Sql Server(2008或2012)使用bcp。出口 文件放在我的本地机器上。我打了两个BCP电话:一个是为了得到 格式化(.fmt)文件,另一个用于获取数据(.dat)的文件(无法 找到一种方法,一步完成这两项工作)
  • 将给定表的数据导入到一个数据库MyDatabase中,我在该数据库中拥有完全权限(根据DBA的声明),可以在同一个SQL server但不同的数据库上,也可以在另一台服务器上。在这里,我的主要目标是自动创建要导入的表(基于导出的fmt文件),以及实际导入其数据
  • 我已经实现了第1点,在这里我可以动态指定要导出的服务器、目录、模式和表,python会自动在本地机器上的专用文件夹下创建table.dat和table.fmt文件-专用共享文件夹

    专用共享文件夹是本地计算机上的共享文件夹,用于存储导出的表及其fmt文件。我正试图将这些表导入的SQL服务器可以访问它

    在第2点中,我使用python构建了一个SQL语句,如下所示:

    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), 自动提交=真) ....
  • .... cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s' % (server, catalog, login, pw), autocommit=True) ....