问题描述
我正在尝试使用 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)