FreeBCP到SQL Azure抱怨表不存在

时间:2012-11-17 16:40:45

标签: sql-server azure-sql-database freetds freebcp

$ freebcp DWSTAGE.BCPTEST in bcptest.txt -f cdr.fmt -S serverfromfreetds -U user@azureserver -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 user@azureserver -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数据库。

与SQL Azure的连接似乎没问题 - 我只是无法让FreeBCP工作:

$ isql serverfromfreetds user@azuredatabasename 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 个答案:

答案 0 :(得分: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选项,因为在每个TDS服务器确实接受Azure之前 语法。

您可以使用

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

作为一种临时解决方法,我认为这样可行:

    freebcp DWSTAGE.BCPTEST in bcptest.txt \
    -O 'USE dbname' \
    -f cdr.fmt -S serverfromfreetds -U user@azureserver -P password

永久性修复将支持-D。


是的,该用户的默认数据库可能是主数据库。有一个 默认数据库在odbc配置中设置,但我错了,那里 在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的支持)

答案 1 :(得分:0)

我已经freebcp使用Ubuntu 12.04和Azure SQL。它接着是上面的答案,其中提到了对-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服务器不支持”。

下一步是要注意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 myUserName@myServer -S MyServerConfig -P 'mypa$$word' -D myDatabase -c -e upload.err