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 -q
y 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 out
a ser queryout
, y luego cambiar el nombre de la tabla para que sea parte de una SELECT
declaració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 tempdb
ya que la única columna en mi tabla de prueba usa el INT
tipo 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_CS
esa 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_Name
trabajar. 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.