Comando bcp Sintaxe incorreta perto de ' '. Personagem é realmente: "ä"


11

Eu tenho o mssql-server e o mssql-tools instalados no Ubuntu (Linux). Quando tento exportar dados com o comando bcp usando a seguinte linha de comando:

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

Eu recebo este erro:

SQLState = 37000, NativeError = 102
Erro = [Microsoft] [Driver ODBC 13 para SQL Server] [SQL Server] Sintaxe incorreta perto de ' '.

O é ä.

Se eu colocar o Täble_Namecolchete entre colchetes:

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

Eu recebo este erro no nome do objeto:

SQLState = S0002, NativeError = 208
Erro = [Microsoft] [Driver ODBC 13 para SQL Server] [SQL Server] Nome de objeto inválido 'DBname.dbo.Täble_Name'.

Fui mais longe e adicionei aspas simples ''junto com a -qopção (que permite identificadores entre aspas ):

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

O erro se torna:

SQLState = S0002, NativeError = 208
Erro = [Microsoft] [Driver ODBC 13 para SQL Server] [SQL Server] Nome de objeto inválido 'DBname.dbo.T ble_Name'.

Nota: o comando funciona perfeitamente com nomes de tabelas sem esse caractere especial ä.

Respostas:


7

Acredito que esse seja um problema de codificação entre o shell e o bcp / SQL Server. O SQL Server espera UTF-16 Little Endian, mas o Linux não está usando isso. O padrão para minha VM Linux é UTF-8 via en_GB.UTF-8.

<TL; DR> Use o comando "queryout" bcp e especifique em "SELECT * FROM ..."vez de usar o comando "out" e simplesmente fornecendo um nome de tabela.

O que segue é o meu teste ...


Eu obtive a lista de códigos de idioma / codificações disponíveis usando:

$ locale -a

devolvida:

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

Eu tentei várias dessas opções definindo:

$ export LC_CTYPE=C.UTF-8

e tente novamente usando:

$ export LC_ALL=C.UTF-8

Nada parecia fazer a diferença. E cada vez que eu tentava com várias combinações de colchetes sem -qe depois com -qe depois sem colchetes com e sem -q.

Eu até tentei injetar os bytes que equivaleriam ao caractere UTF-16 LE de ävia $'\xe4\x00'e even $'\xe4'$'\x00', mas sem melhorias.

CONTUDO,

o que funcionou foi alterar o comando bcp de outpara, em vez disso queryout, e depois alterar o nome da tabela para fazer parte de uma SELECTinstrução (eu removi a -r ~opção somente aqui para fazer a linha de comando não rolar horizontalmente, mas estava no meu teste). Criei a tabela [tempdb]e executei o seguinte:

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

Sem problemas lá. Mas, curiosamente, mudei o sotaque äpara um sem sotaque a:

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

e recebeu o seguinte erro:

SQLState = S1000, NativeError = 0
Erro = [Microsoft] [Driver ODBC 13 para SQL Server] Não é possível resolver agrupamentos no nível da coluna

Isso é um erro do bcp e deve estar se referindo aos metadados de, tempdbjá que a única coluna na minha tabela de teste usa o INTtipo de dados.

Agora, meu agrupamento no nível da instância é sensível ao sotaque, então eu realmente não esperava que o não acentuado afuncionasse (embora eu esperasse um erro de "objeto inválido"). Portanto, para testar a insensibilidade ao sotaque, criei um novo banco de dados com um agrupamento de Latin1_General_100_CI_AI_KS_WS_CS, criei a mesma tabela no novo banco de dados e adicionei algumas linhas. Eu executei os dois testes a seguir:

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

e ambos funcionaram!

Voltando ao comando bcp inicial de apenas especificar o nome da tabela em vez de uma consulta, pude obter ImportTest.dbo.[Table_Name]e ImportTest.dbo.Table_Nametrabalhar. No entanto, eu ainda não consegui obter nenhuma combinação de ImportTest.dbo.[Täble_Name]trabalho; todas as variações tiveram os mesmos erros de antes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.