使用Python执行bcp将查询从远程服务器导出到本地驱动器

时间:2019-01-28 17:19:02

标签: python sql-server bcp

我有下面的python语句组。我正在使用Python使用动态构建的SQL语句。然后将生成的SELECT语句用作BCP中的queryout语句。

我的问题是查询本身太大,并且BCP无法对其进行操作。我已经确认BCP可以使用:

BCP "Select * from <<DATABASE.dbo.TABLE>>" queryout "D:\data\test.csv" -t^ -r '0x0A' 
    -U <<USER>> -P <<PASSWORD>> -S "LIVE" -c -C65001

但是,如果select语句返回大量数据,则该语句将失败。我该如何应对?该表很大(超过100m条记录),我要做的就是使用动态SQL将其从远程服务器导出到本地表。

Python脚本:

def getRoster(self):
    self.conn = pyodbc.connect(self.ConnStr)
    sql = r'SELECT * FROM <<DB>>.dbo.TableConfiguration'
    self.roster = pd.read_sql(sql,self.conn)

def GenerateSQL(self, table):
    exportsql = 'select '

    columnsql = """select
                    'CASE WHEN ISNULL('+COLUMN_NAME+', '''') = '''' THEN '''' ELSE '+COLUMN_NAME+' END AS '+UPPER(COLUMN_NAME)
                    from <<DB>>.INFORMATION_SCHEMA.COLUMNS
                    where TABLE_NAME = '%s'
                    order by ORDINAL_POSITION""" % table.tablename
    self.conn = pyodbc.connect(self.ConnStr)
    cursor = self.conn.cursor()
    cursor.execute(columnsql)
    exportsql += ', '.join([field[0] for field in cursor])
    exportsql += ' from {}.dbo.{}'.format(table.dbname, table.tablename)
    exportsql += ' {}'.format(table.Clause)
    return (exportsql)

def ExportTables(self):
    now = datetime.now()
    self.getRoster()
    for row in self.roster.itertuples():
         SQL = self.GenerateSQL(row)
         self.filename = '{}_{}.csv'.format(row.tablename, now.strftime("%Y-%m-%d"))
         command = 'BCP \"{}\" queryout \"{}\" -t|| -U "<<USER>>" -P <<PASSWORD>> -S "LIVE" -T -r 0x0a -c -C65001'.format(SQL, os.path.join(self.path, self.filename))
         print (command)
         subprocess.run(command)

当使用SELECT 'test'测试bcp时,它恢复正常。但是当生成sql时,该sql在SMSS中运行,但是在bcp中,错误为:

SQLState = 28000, NativeError = 18452
Error = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Login failed. The login is from an untrusted domain and cannot be used with Windows authentic
ation.

1 个答案:

答案 0 :(得分:4)

从BCP命令行中删除-T参数,并使用SQL Server身份验证。

bcp Utility - T

  

当bcp实用程序以受信任的方式连接到SQL Server时   使用集成安全性进行连接,请使用-T选项(受信任   连接),而不是用户名和密码的组合。什么时候   bcp实用程序正在连接到SQL数据库或SQL数据仓库,   使用Windows身份验证或Azure Active Directory身份验证   不支持。使用-U和-P选项。