【问题标题】:Using Python to execute bcp to export query from remote server to local drive使用 Python 执行 bcp 将查询从远程服务器导出到本地驱动器
【发布时间】:2019-06-21 18:16:56
【问题描述】:

我有以下 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.

【问题讨论】:

  • 它是如何失败的?有错误信息吗?它有输出吗?还是输出不正确的信息?您是否尝试过从命令行手动运行它,并且这样做是否会给出任何不同的错误消息?
  • 是的。它给我一个糟糕的登录错误。看来 bcp 显然只允许这么多字符
  • 我用select "test" 替换了它,效果很好。
  • 错误信息的确切措辞是什么?您可以将其添加到您的问题中吗?
  • 已添加。非常感谢!

标签: python sql-server bcp


【解决方案1】:

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

bcp Utility - T

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

【讨论】:

  • 这太令人沮丧了。为什么 -T 对短查询起作用?这就是为什么我无法弄清楚。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多