$ 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>
这似乎有些数据库/架构混乱,但我找不到有效的设置组合。
答案 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选项支持该功能。
见变更
(在freebcp中添加对-D的支持)
答案 1 :(得分:0)
我已经freebcp
使用Ubuntu 12.04和Azure SQL。它接着是上面的答案,其中提到了对-D
的支持。
首先,我开始按照此主题中的说明安装和配置freetds
:https://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
。
使用./configure
和make
进行安装,然后使用新的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