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.
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!
fuente
Respuestas:
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 .
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.
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).
fuente
Otra opción, una que acabo de aprender, proviene de la
sqlcmd
documentación . Debe configurar la página de códigos parasqlcmd
que 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
fuente
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
convert
de 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.fuente