2012-11-17 94 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