2012-11-17 136 views
2
$ freebcp DWSTAGE.BCPTEST in bcptest.txt -f cdr.fmt -S serverfromfreetds -U [email protected] -P password 
Msg 208, Level 16, State 1 
Server 'azureserver', Line 1 
    Invalid object name 'DWSTAGE.BCPTEST'. 
Msg 208, Level 16 
General SQL Server error: Check messages from the SQL Server 

Msg 20064, Level 2 
Attempt to use Bulk Copy with a non-existent Server table 

$ freebcp DATABASENAME.DWSTAGE.BCPTEST in bcptest.txt -f cdr.fmt -S serverfromfreetds -U [email protected] -P password 
Msg 40515, Level 15, State 1 
Server 'azureserver', Line 16 
    Reference to database and/or server name in 'DATABASENAME.DWSTAGE.BCPTEST' is not supported in this version of SQL Server. 
Msg 40515, Level 15 
General SQL Server error: Check messages from the SQL Server 

Msg 20064, Level 2 
Attempt to use Bulk Copy with a non-existent Server table 

我也嘗試使用-D選項將數據庫添加到命令行。該連接的默認數據庫被設置爲freetds.conf中的這個且僅有的Azure數據庫。FreeBCP到SQL Azure抱怨表不存在

到SQL Azure的連接似乎罰款,否則 - 我只是不能FreeBCP工作:

$ isql serverfromfreetds [email protected] password 
+---------------------------------------+ 
| Connected!       | 
|          | 
| sql-statement       | 
| help [tablename]      | 
| quit         | 
|          | 
+---------------------------------------+ 
SQL> SELECT COUNT(*) FROM DWSTAGE.BCPTEST; 
+------------+ 
|   | 
+------------+ 
| 0   | 
+------------+ 
SQLRowCount returns 1 
1 rows fetched 
SQL> SELECT COUNT(*) FROM DWSTAGE.BCPTESTX; 
[ISQL]ERROR: Could not SQLExecute 
SQL> 

這似乎是一些數據庫/模式的混亂,但我無法找到設置的組合,作品。

回答

2

來自FreeTDS郵件列表:

消息208來自服務器。快速瀏覽freebcp.c顯示 argv [1]未被解析。它被複制到一個結構並逐字逐句地使用

    if (dbfcmd(dbproc, "SET FMTONLY ON select * 

%s的SET FMTONLY OFF」,pdata-> DBOBJECT)== FAIL)

我的猜測是,你正在與登錄帳戶都有一個默認的 數據庫,該數據庫是不包含DWSTAGE.BCPTEST之一。 Azure的服務器拒絕dbname.schema.object語法和freebcp有 沒有-D選項,因爲直到Azure的每一個TDS服務器並接受 語法。

你可以驗證使用

$ freebcp 'select db_name()' queryout /dev/stdout ... 

作爲暫時的解決辦法,我認爲這會工作:

freebcp DWSTAGE.BCPTEST in bcptest.txt \ 
    -O 'USE dbname' \ 
    -f cdr.fmt -S serverfromfreetds -U [email protected] -P password 

一個永久性的修復將支持-D。


是的,該用戶的默認數據庫可能是主人。在odbc config中有一個 默認數據庫,但我誤解了,在freeetds.conf中沒有這樣的選項 。

現在我們已經開始嘗試讓Linux爲此進程工作,但現在我會重新訪問該進程。

我想到的解決辦法是行不通的,因爲不支持USE - 你實際上必須直接連接到數據庫中,SQL Azure的架構,因爲 性質。


是的,你說得對。我忘了那個。

大約一年前,我們添加了DBSETLDBNAME宏作爲在db-lib LOGINREC中設置 dbname的一種方法。這將在登錄 數據包中設置dbname,避免使用「USE dbname」。可以修改freebcp 以使用-D選項支持該功能。


見變化

http://gitorious.org/freetds/freetds/commit/4a21ded022405693607e71938d0c6173816f5ff9/diffs/c34afafd2fec4cbba9b245e4f13a5471c6fb8041

(在freebcp增加對-D支持)

0

我已經得到了freebcp與Ubuntu 12.04和SQL Azure的工作。接下來回到上面提到的支持-D的答案。

首先,我開始通過安裝並在此線程描述配置freetdshttps://askubuntu.com/questions/167491/connecting-ms-sql-using-freetds-and-unixodbc-isql-no-default-driver-specified

基本上,這包括了: sudo apt-get install tdsodbc unixodbc freetds-bin

這給我帶來的地步,這個線程啓動; freebcp可能會連接,但我得到了有關「引用數據庫......在此版本的SQL Server中不支持」的錯誤。

下一步要注意的是,由apt-get安裝的freebcp版本是一個相當老的版本。請從ftp://ftp.freetds.org/pub/freetds/stable/下載最新版本。我用freetds-1.00.9.tar.gz

使用./configuremake安裝它,然後使用這個新的freebcp只是與-D相同。

這是我的命令字符串:freetds-1.00/src/apps/freebcp bcptest in bcptest.big.dat -U [email protected] -S MyServerConfig -P 'mypa$$word' -D myDatabase -c -e upload.err