El comando SQLCMD no puede insertar acentos


19

Estoy tratando de ejecutar sqlcmd.exe para configurar una nueva base de datos desde la línea de comandos. Estoy usando SQL SERVER Express 2012 en Windows 7 de 64 bits.

Aquí está el comando que uso:

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log 

Y aquí hay una parte del script de creación de archivos sql:

    CREATE DATABASE aqualogy 
    COLLATE Modern_Spanish_CI_AS
    WITH TRUSTWORTHY ON, DB_CHAINING ON;
    GO
    use aqualogy
    GO
    CREATE TABLE [dbo].[BaseLayers] (
    [Code] nchar(100) NOT NULL ,
    [Geometry] nvarchar(MAX) NOT NULL ,
    [IsActive] bit NOT NULL DEFAULT ((1)) 
    )

    EXEC sp_updateextendedproperty @name = N'MS_Description', @value = N'Capas de     cartografía base de la aplicaicón. Consideramos en Galia Móvil la cartografía(...)'
, @level0type = 'SCHEMA', @level0name = N'dbo'
, @level1type = 'TABLE', @level1name = N'BaseLayers'

Bueno, por favor verifique que haya algunos acentos en las palabras; cual es la descripción de la tabla. La base de datos se crea sin problemas. La secuencia de comandos comprende 'Intercalar', como puede ver en la captura de pantalla adjunta. A pesar de esto, los acentos no se muestran correctamente al examinar la tabla.Problema de colación

Realmente agradecería cualquier ayuda. Muchas gracias.

[Editar]: Hola a todos. ¡Cambiar la codificación del archivo SQL usando Notepad ++ funcionó bien! Muchas gracias por su ayuda: ¡Aprendí algo interesante con este problema!

ingrese la descripción de la imagen aquí


1
¿Cuál es la codificación de su archivo de script SQL?
Pondlife

Yo iría con la idea de @ Pondlife. Tome un editor de texto (como Notepad ++), abra el archivo .sql allí, vaya a Codificación y vea que su archivo no está en ANSI (o alguna otra codificación no compatible). Si es así, elija convertir el archivo a otra cosa. Yo diría que UTF8 debería hacerlo. Háganos saber cómo te fue.
Marian

Respuestas:


8

A partir de los comentarios, el problema no es exactamente con la tabla o la forma en que SQLCMD importa los caracteres especiales. Por lo general, las importaciones problemáticas están relacionadas con el formato del script en sí.

Management Studio en sí ofrece la opción de guardar con una codificación específica, que debería resolver el problema en el futuro. Cuando guarde un archivo por primera vez (o use guardar como) debe hacer clic en la flecha pequeña cerca del botón Guardar , para usar la opción Guardar con codificación .

ingrese la descripción de la imagen aquí

Por defecto guarda el archivo en Europa occidental (1252) . Siempre que tengo caracteres especiales, uso UTF8 (aunque tal vez encajaría alguna otra codificación restrictiva) porque generalmente es la solución más rápida.

ingrese la descripción de la imagen aquí

No estoy seguro (de la imagen) de que está utilizando SSMS, así que asegúrese de que su propio editor tenga la opción de guardar el archivo en una codificación diferente. Si no, convertir el archivo en un editor inteligente (como ya lo has intentado en Notepad ++) generalmente funciona. Aunque eso podría no funcionar si está convirtiendo de una codificación amplia a una más estrecha y luego regresa a una amplia (por ejemplo: de Unicode a ANSI y de nuevo a Unicode).


Hola marian Gracias de nuevo. Utilicé la función 'Transferencia de datos' de Navicat, porque me gusta la forma en que genera el script sql (rápido, independiente del archivo mdf, y desde ahora siempre ha funcionado para mí). Verifiqué algunos parámetros en la función 'Transferencia de datos' en Navicat, pero no encontré ninguna forma de cambiar la codificación del archivo de salida. Tendré que hacer un trabajo adicional usando Notepad ++ para cambiar la codificación, pero no es gran cosa.
Oskytar

Bueno no hay problema. Sin embargo, generalmente, las gracias en este sitio se entregan utilizando la función de Votación a favor (la flecha hacia arriba cerca de la respuesta) si la respuesta es útil o, si resuelve su problema por completo, incluso usando la Marca como respuesta (la Marca de verificación cerca de la respuesta ) :-). Vea más aquí, en las preguntas frecuentes .
Marian

Corrijo mi último comentario: ES posible elegir la codificación de salida del archivo al ejecutar 'Transferencia de datos' con Navicat.
Oskytar

Genial, así que ahora podrás evitar el paso de conversión manual. Eso es aun mejor.
Marian

2
Esta respuesta parece no ser correcta. Tenía el archivo guardado por Notepad ++ en UTF-8. SQLCMD.exe no transfiere los caracteres correctamente. Si copio el contenido a SSMS, funciona bien. La verdadera solución fue la respuesta proporcionada por swasheck para agregar el parámetro -f 65001.
Tomas Kubes

39

Otra opción, una que acabo de aprender, proviene de la sqlcmddocumentación . Debe configurar la página de códigos para sqlcmdque coincida con la de la codificación del archivo. En el caso de UTF-8, la página de códigos es 65001, por lo que querrá:

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001


1
Esto acaba de salvarme la vida, estaba a punto de hacer un script de PowerShell para leer un archivo CSV con UTF8 import-csv -coding ir a hacer esto correctamente. Gracias
Spörri

Esto funcionó para mí cuando tuve que insertar valores de texto irlandés con fadas (á, é, í, ó, ú) en una columna NVARCHAR
mediodía y el

Esta es la respuesta correcta
Pitchmatt

2

Este tipo de cosas es muy complicado porque se hace mucho sin decírselo.

Lo primero que haría es usar sqlcmd para mostrar la cadena. Si se muestra correctamente en la ventana cmd.exe, ese es un hecho útil. Luego, seleccionaría la fila convertde la cadena a varbinary para ver qué bytes hay realmente allí. Creo que la cartografía se mostrará como0x636172746f67726166c3ad61 , donde la "i" acentuada está representada por los bytes c3ad, que es la codificación UTF-8 para ese carácter. No es bueno tener UTF-8 en una columna de español moderno (Windows 1252). El valor de byte en Windows 1252 para ese carácter es 237 decimal (hexadecimal ED).

Si la columna contiene datos mal codificados, entonces el error radica en cómo se insertó. Quizás eliminar la N inicial en las constantes de cadena ( N'string'le dice a SQL Server que genere una cadena Unicode, pero simplemente 'string'indica que los caracteres usan la codificación del cliente) insertaría español moderno en lugar de Unicode.

Si la columna contiene datos codificados correctamente, entonces diría que encontró un error en la pantalla de la GUI.

Si no puede hacer que sqlcmd inserte los datos correctamente (N o no), entonces quiere quejarse con Microsoft. Cuando lo haga, ser capaz de mostrar los bytes almacenados en la columna (usando convert(colname as varbinary)) será fundamental para explicar qué está mal.


Hola James, muchas gracias por tu respuesta detallada. Hice algunas pruebas y Sqlcmd.exe no muestra la cadena correcta. Es claramente un problema sobre cómo se insertan los datos.
Oskytar

Usando Sql Profiler, depuré las oraciones que se enviaron a SQL SERVER al usar el cliente SQl Server GUI. INSERTAR EN [ElementType] ([Código], [Nombre], [Descripción], [GeometryType], [stringId], [CapturedGeometryType]) VALUES ('ESTACION', 'Estación', 'Estación', 'Multipoint', NULL, 'Punto'); funcionó FINE, por lo que todos los acentos se insertaron correctamente. Esa es la misma 'insertar oración' que aparece en mi script sql. ¿Debo especificar el código de caracteres en el archivo de script sql?
Oskytar
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.