BCP 在使用有效语句时既不给出结果也不输出任何内容,但在传递无效参数时会抛出错误

BCP neither gives results nor outputs anything when using valid statements but it does throw errors when passing invalid parameters

我必须使用 bcp 命令行工具将数据从 SQL Server 数据库导出到一个文件红帽服务器。 我(显然)使用了有效的语句,但是 bcp 没有产生任何类型的 output/results。 但是,当我执行缺少或无效参数的语句时,它会显示相应的错误。 我正在寻找这个问题的原因(例如安装有缺陷、bcp 的错误使用、缺乏权限或任何其他已知的冲突)以及如何解决它。


bcp 语句:

bcp fully_qualified_table_name out ./data.txt -c -S server -U user -P password

bcp 用法:

usage: /opt/microsoft/bin/bcp {dbtable | query} {in | out | queryout | format} datafile
  [-m maxerrors]            [-f formatfile]          [-e errfile]
  [-F firstrow]             [-L lastrow]             [-b batchsize]
  [-n native type]          [-c character type]      [-w wide character type]
  [-N keep non-text native] [-q quoted identifier]
  [-t field terminator]     [-r row terminator]
  [-a packetsize]           [-K application intent]
  [-S server name or DSN if -D provided]             [-D treat -S as DSN]
  [-U username]             [-P password]
  [-T trusted connection]   [-v version]             [-R regional enable]
  [-k keep null values]     [-E keep identity values]
  [-h "load hints"]         [-d database name]

bcp 版本:

BCP - Bulk Copy Program for Microsoft SQL Server.
Copyright (C) Microsoft Corporation. All Rights Reserved.
Version: 11.0.2270.0

SQL服务器版本(SELECT @@VERSION):

Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
   May 14 2014 18:34:29
   Copyright (c) Microsoft Corporation
   Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

分布:

Red Hat Enterprise Linux 6.7 (KornShell).

带有相应错误消息(示例)的无效语句。

bcp THAT_TUB_ACE.oh_nerd.table_name out ./data.txt -c -S sr._bear -U you_sr. -P pass_sword

    SQLState = S1T00, NativeError = 0
    Error = [unixODBC][Microsoft][ODBC Driver 11 for SQL Server]Login timeout expired
    SQLState = 08001, NativeError = 11001
    Error = [unixODBC][Microsoft][ODBC Driver 11 for SQL Server]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
    SQLState = 08001, NativeError = 11001
    Error = [unixODBC][Microsoft][ODBC Driver 11 for SQL Server]TCP Provider: Error code 0x2AF9

...

bcp fully_qualified_table_name ./data.txt -c -S valid_server -U valid_user -P bad_word

    bcp fully_qualified_table_name out ./data.txt -c -S valid_server -U valid_user -P bad_word
    SQLState = 28000, NativeError = 18456
    Error = [unixODBC][Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'valid_user'.

摘要。

objective是使用以下语法(或类似)生成数据文件:

bcp fully_qualified_table_name out ./data.txt -c -S server -U user -P password

事实是:

希望你已经解决了你的问题,但我在 RedHat 7.1 上为 Python 3.4 配置 PyODBC 时遇到了类似的问题。我正在尝试连接到 Microsoft SQL Server 2016。希望这会对其他人有所帮助。

对我来说真正的问题是 ODBC/FreeTDS 配置。下面是我的安装步骤和最终的解决方案。

  1. 我从安装 Microsoft's ODBC driver for redhat 开始。这可能不是必需的,但我在这里列出它,因为我从来没有从我的 redhat 机器上删除它,因为担心破坏 ODBC。
  2. 安装ODBC和ODBC开发文件:yum install unixODBC-devel.x86_64
  3. 安装 FreeTDS:yum install freetds.x86_64
  4. 更新配置文件。步骤 1-3 大约需要 10 分钟。我花了非常沮丧的一天尝试各种配置,通常我能够通过 tsql(FreeTDS 调试工具,下面有更多内容)进行连接,但从来没有通过 Python 进行连接。我最终偶然发现了 this blog,它通过 ldconfig -p | grep libtdsodbc 向我指出了正确的驱动程序(我相信这指向了 FreeTDS 驱动程序,因此可能不需要 Microsoft 的驱动程序)。

我最终得到的配置如下:

/etc/odbc.ini(注意:我不得不创建这个文件,因为 ODBC/FreeTDS 安装过程没有为我创建它。)

[SQLServer]
Description = TDS driver (Sybase/MS SQL)
Driver      = SQLServer
Servername  = your_sql_hostname
TDS Version = 0.95
Database    = your_database_name (not to be confused with instance name)
Port        = 1433

/etc/odbcinst.ini

[ODBC]
# Enables ODBC debugging output.  Helpful to see where things stop working.
Trace = yes
TraceFile = /etc/odbcinst.trace

[SQLServer]
Description=TDS driver (Sybase/MS SQL)
Driver=/lib64/libtdsodbc.so.0
Driver64=/lib64/libtdsodbc.so.0
UsageCount=1

疑难解答提示

tsql 是 FreeTDS 自带的 debugging/testing 工具。它是你的朋友。我能够在早期使用它来验证事物的网络方面是否正确(即没有防火墙阻止访问、主机名解析等)。

使用 tsql -H your_sql_hostname -L 从您的 SQL 服务器获取实例名称和端口。请注意,您将在上面的 ODBC 配置中使用端口 1433(这是 MS SQL 实例发现端口),而不是这些端口号。

ServerName   your_sql_hostname
InstanceName instance_1_name
IsClustered  No
Version      13.0.x.x
tcp          5555

ServerName   your_sql_hostname
InstanceName instance_2_name
IsClustered  No
Version      13.0.x.x
tcp          6666

像这样使用上一个 tsql 命令的端口:

tsql -H your_sql_hostname -p your_sql_instance_port -D your_database_name -U your_username -P your_password

您应该会收到提示。尝试从您的数据库中查询一些数据(请注意,您必须在单独的行中键入 GO 才能实际 运行 您的查询)。如果这有效但您仍然无法通过 Python/other-app 连接,这通常意味着 ODBC/FreeTDS 安装正确并且没有网络问题,但您的 ODBC 配置不正确。

1> SELECT TOP 1 * FROM your_table
2> GO
{a row will be returned here}
1>    # prompt returns, use `exit` to get out