如何正确地将 Python 中的 BCP 命令发送到远程服务器?

问题描述

我正在尝试使用 python 在远程服务器上运行 BCP 命令。我需要数据,以及每个表的 xml 格式文件。由于我的第一个查询仍然失败,我还没有尝试格式化命令。

import pyodbc
import sys
import subprocess
import os
import bcp

conn = pyodbc.connect('Driver={sql Server};'
                      'Server=10.100.100.10;'
                      'Database=CompanyDatabase;'
                      'Trusted_Connection=yes;')
cursor = conn.cursor()
command = 'bcp.exe CompanyDatabase.dbo.AnyTableName out D:\PROD\BCPLIST\CompanyDatabase_AnyTableName.csv -c -t "|C^|" -r "|R^|" -T -S 10.10.100.100.10'
cursor.execute(command)

执行上面的脚本,总是出现如下错误

pyodbc.ProgrammingError: ('42000',"[42000] [Microsoft][ODBC sql Server Driver][sql Server]'.' 附近的语法不正确。(102) (sqlExecDirectW)")

我能够在批处理脚本中发送命令并且它工作正常,但我的上司真的更喜欢我为此使用 python。执行服务器和远程服务器在网络内是可信的,因此省略了用户/密码参数。

以下工作批处理脚本通过表名的文本文件循环,为每个运行以下命令。 %%x = 数据库中表的名称,行分隔符 |R^|和列 |C^|

bcp.exe CompanyDatabase.dbo.%%x out D:\PROD\BCPLIST\CompanyDatabase_%%x.csv -c -t "|C^|" -r "|R^|" -T -S 10.100.100.10
bcp.exe CompanyDatabase.dbo.%%x format nul -c -x -f D:\PROD\BCPLIST\CompanyDatabaseFormat_%%x.xml -t "|C^|" -r "|R^|" -T -S 10.100.100.10

解决方法

扩展 Panagiotis Kanavos 的评论; 通过使用子进程包——您可以将整个 bcp 命令放入其中并绕过 bcp 实用程序。

import subprocess
datacommand = 'bcp.exe Databasename.dbo.databasetable out D:\DirectoryPath\Testbcp.csv -c -t "|C^|" -r "|R^|" -T -S 10.100.100.10'
subprocess.call(datacommand)
formatcommand = 'bcp.exe Databasename.dbo.databasetable format nul -c -x -f D:\DirectoryPath\Format.xml -t "|C^|" -r "|R^|" -T -S 10.100.100.10'
subprocess.call(formatcommand)