Comando bcp Sintaxis incorrecta cerca de ' '. El personaje es en realidad: "ä"


11

Tengo mssql-server y mssql-tools instaladas en Ubuntu (Linux). Cuando intento exportar datos con el comando bcp usando la siguiente línea de comandos:

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

Me sale este error:

SQLState = 37000, NativeError = 102
Error = [Microsoft] [ODBC Driver 13 para SQL Server] [SQL Server] Sintaxis incorrecta cerca de ' '.

El es ä.

Si lo rodeo Täble_Namecon corchetes:

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

Me sale este error en el nombre del objeto:

SQLState = S0002, NativeError = 208
Error = [Microsoft] [ODBC Driver 13 para SQL Server] [SQL Server] Nombre de objeto no válido 'DBname.dbo.Täble_Name'.

Fui más allá y agregué comillas simples ''junto con la -qopción (que habilita los Identificadores entre comillas ):

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

El error se convierte en:

SQLState = S0002, NativeError = 208
Error = [Microsoft] [ODBC Driver 13 para SQL Server] [SQL Server] Nombre de objeto no válido 'DBname.dbo.T ble_Name'.

NB: el comando funciona perfectamente con nombres de tabla sin este carácter especial ä.

Respuestas:


7

Creo que este es un problema de codificación entre el shell y el servidor bcp / SQL. SQL Server espera UTF-16 Little Endian, pero Linux no está usando eso. El valor predeterminado para mi máquina virtual Linux es UTF-8 vía en_GB.UTF-8.

<TL; DR> Utilice el comando bcp "queryout" y especifique en "SELECT * FROM ..."lugar de utilizar el comando "out" y simplemente proporcione un nombre de tabla.

Lo que sigue es mi prueba ...


Obtuve la lista de configuraciones regionales / codificaciones disponibles usando:

$ locale -a

devuelto:

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

Probé varias de esas opciones configurando:

$ export LC_CTYPE=C.UTF-8

y luego intenta de nuevo usando:

$ export LC_ALL=C.UTF-8

Nada parecía hacer la diferencia. Y cada vez que lo intenté con varias combinaciones de corchetes sin -qy luego con -q, y luego sin corchetes con y sin -q.

Incluso intenté inyectar los bytes que equivaldrían al carácter UTF-16 LE de ävia $'\xe4\x00'e incluso $'\xe4'$'\x00', pero no hubo mejoras.

SIN EMBARGO,

lo que funcionó fue cambiar el comando bcp de outa ser queryout, y luego cambiar el nombre de la tabla para que sea parte de una SELECTdeclaración (eliminé el -r ~interruptor solo aquí para que la línea de comando no se desplace horizontalmente, pero estaba en mi prueba). Creé la tabla [tempdb]y ejecuté lo siguiente:

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

No hay problemas allí. Pero curiosamente, cambié el acentuado äa uno sin acento a:

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

y recibió el siguiente error:

SQLState = S1000, NativeError = 0
Error = [Microsoft] [ODBC Driver 13 para SQL Server] No se pueden resolver intercalaciones de nivel de columna

Ese es un error de bcp y debe referirse a los metadatos tempdbya que la única columna en mi tabla de prueba usa el INTtipo de datos.

Ahora, mi Intercalación a nivel de instancia es sensible al acento, por lo que realmente no esperaba que funcionara el sin acento a(aunque esperaba un error de "objeto no válido"). Entonces, para probar la insensibilidad al acento, creé una nueva Base de Datos con una Clasificación, creé Latin1_General_100_CI_AI_KS_WS_CSesa misma tabla en el nuevo DB y agregué algunas filas. Luego ejecuté las siguientes dos pruebas:

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

y ambos trabajaron!

Volviendo al comando bcp inicial de solo especificar el nombre de la tabla en lugar de una consulta, pude obtener ImportTest.dbo.[Table_Name]y ImportTest.dbo.Table_Nametrabajar. Sin embargo, todavía no pude conseguir ninguna combinación de ImportTest.dbo.[Täble_Name]trabajo; Todas las variaciones tienen los mismos errores que antes.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.