2016-09-26 35 views
2

我不得不使用BCP命令行工具將數據從SQL服務器數據庫導出到一個文件中的一個紅色的時候它拋出的錯誤時,既不給出的結果也沒有輸出任何東西帽子服務器。 我(顯然)使用有效的陳述,但bcp沒有產生任何類型的輸出/結果。 但是,當我執行缺少或無效參數的語句時,它會顯示相應的錯誤。 我正在查找此問題的原因(例如安裝有缺陷,使用不當,bcp,缺少權限或任何其他已知衝突)以及如何解決此問題。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 Server版本(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'. 

摘要。

的目標是使用下面的語法(或類似)來生成數據文件:

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

事實是:

  • 當運行一個有效BCP聲明沒有什麼窗口根本沒有輸出,也沒有創建數據文件。
  • 我不能爲BCP使用(使用集成的安全可信的連接)選項-T所以我必須指定服務器,用戶名和密碼
  • 嘗試queryout選項上一個非常簡單的小桌子已經但仍然沒有運氣。
  • 憑證有效,我使用sqlcmd成功對其進行了測試,如下所示:sqlcmd -S server -U user -P password -Q 'SELECT * FROM really_small_table'
  • BCP「無效的聲明與相應的錯誤信息(例子)」這個問題部分陳述只是無效聲明的例子表明,BCP實際上做的東西,但給出預期的結果。
+0

您的用戶是否有寫入權限的文件夾要寫輸出文件?由於BCP先嚐試連接到SQL服務器,因此獲取錯誤憑證的錯誤屬於正常情況,所以如果失敗,它將不會嘗試執行其他任何操作。 –

+0

嗨@IonutTulai,權限是正確的。 –

回答

0

希望你已經解決了你的問題,但是我在配置PyODBC for Python 3.4在RedHat 7.1上遇到類似的問題。我試圖連接到Microsoft SQL Server 2016.希望這會幫助別人。

對我來說真正的問題是ODBC/FreeTDS配置。以下是我採取的安裝步驟和最終的解決方案。

  1. 我開始安裝Microsoft's ODBC driver for redhat。這可能不是必需的,但是我在這裏列出它,因爲我害怕破壞ODBC,所以我從來沒有從我的Redhat機器中刪除它。
  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驅動程序,因此可能不需要微軟的驅動程序)。

最終的配置我結束瞭如下:

/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自帶的調試/測試工具。這是你的朋友。我能夠在早期使用它來驗證網絡方面的事情是否正確(即沒有防火牆阻止訪問,主機名解析等)。使用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 

從以前的T-SQL命令使用的端口,像這樣:

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