bcp命令'。'附近的语法不正确。字符实际上是:“ä”


11

我 在Ubuntu(Linux)上安装了mssql-servermssql-tools。当我尝试使用bcp命令使用以下命令行导出数据时:

bcp DBname.dbo.Täble_Name out Täble_Name -c -k  -S127.0.0.1 -Usa -PpassWord -r ~

我收到此错误:

SQLState = 37000,NativeError = 102
错误= [Microsoft] [用于SQL Server的ODBC驱动程序13] [SQL Server]'。'附近的语法不正确。

ä

如果我Täble_Name用方括号括起来:

 bcp DBname.dbo.[Täble_Name] out Täble_Name -c -k  -S127.0.0.1 -Usa -PpassWord -r ~

我在对象名称上收到此错误:

SQLState = S0002,NativeError = 208
错误= [Microsoft] [SQL Server的ODBC驱动程序13] [SQL Server]无效的对象名'DBname.dbo.Täble_Name'。

我走得更远,并''-q选项中添加了单引号(启用引号标识符):

bcp 'DBname.dbo.[Täble_Name]' out Täble_Name -c -k  -S127.0.0.1 -Usa -PpassWord -r ~ -q

错误变为:

SQLState = S0002,NativeError = 208
错误= [Microsoft] [SQL Server的ODBC驱动程序13] [SQL Server]无效的对象名'DBname.dbo.T.ble_Name'。

注意:该命令与没有特殊字符ä的表名完美配合。

Answers:


7

我相信这是Shell与bcp / SQL Server 之间的编码问题。SQL Server希望使用UTF-16 Little Endian,但Linux并未使用它。我的Linux VM的默认值为UTF-8通过en_GB.UTF-8

<TL; DR>使用“ queryout” bcp命令并指定"SELECT * FROM ..."而不是使用“ out”命令,只需提供表名即可。

接下来是我的测试...


我使用以下方法获取可用的语言环境/编码列表:

$ locale -a

回:

C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX

我通过设置尝试了其中几个选项:

$ export LC_CTYPE=C.UTF-8

然后再尝试使用:

$ export LC_ALL=C.UTF-8

似乎没有什么改变。而且每次我尝试使用方括号的各种组合(不带-q和带)-q,然后都没有方括号(带和不带)-q

我什至尝试注入相当于ävia $'\xe4\x00'和even 的UTF-16 LE字符的字节$'\xe4'$'\x00',但是没有任何改进。

然而,

什么的工作是改变BCP从命令out,而不是要queryout,然后更改表名是部分SELECT陈述(我删除了-r ~开关只有在这里,使命令行不滚动水平,但它是在我的测试)。我在其中创建表[tempdb]并运行以下命令:

bcp "SELECT * FROM tempdb.dbo.[Täble_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass

那里没有问题。但有趣的是,我将重音符号更改ä为非重音符号a

bcp "SELECT * FROM tempdb.dbo.[Table_Name]" queryout tab -c -k  -S127.0.0.1 -Usa -Ppass

并收到以下错误:

SQLState = S1000,NativeError = 0
错误= [Microsoft] [SQL Server的ODBC驱动程序13]无法解决列级排序规则

这是bcp的错误,并且必须引用的元数据,tempdb因为测试表中的唯一列使用的是INT数据类型。

现在,我的实例级别的归类是对重音敏感的,因此我并不是真的希望非重音a能够正常工作(尽管我确实期望出现“无效对象”错误)。因此,为了测试不区分重音的情况,我创建了一个新的Collat​​ion为的数据库,在新数据库中Latin1_General_100_CI_AI_KS_WS_CS创建相同的表,并添加了几行。然后,我运行了以下两个测试:

bcp "SELECT * FROM ImportTest.dbo.[Täble_Name]" queryout tab -c -k  -S127.0.0.1 -Usa -Ppass

bcp "SELECT * FROM ImportTest.dbo.[Table_Name]" queryout tab -c -k  -S127.0.0.1 -Usa -Ppass

都工作了!

让我们回到最初的BCP的只是指定的,而不是一个查询表名的命令,我是能够得到ImportTest.dbo.[Table_Name]ImportTest.dbo.Table_Name工作。但是,我仍然无法兼顾ImportTest.dbo.[Täble_Name]工作。所有版本的错误均与以前相同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.