Estou tentando executar o sqlcmd.exe para configurar um novo banco de dados na linha de comando. Estou usando o SQL SERVER Express 2012 no Windows 7 de 64 bits.
Aqui está o comando que eu uso:
SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log
E aqui está uma parte do script de criação de arquivo 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'
Bem, por favor, verifique se há alguns acentos nas palavras; qual é a descrição da tabela. O banco de dados é criado sem problemas. 'Agrupar' é entendido pelo script, como você pode ver na imagem em anexo. Apesar disso, os acentos não são mostrados corretamente ao examinar a tabela.
Eu realmente aprecio qualquer ajuda. Muito obrigado.
[Editar]: Olá a todos. Alterar a codificação do arquivo SQL usando o Notepad ++ funcionou bem! Muito obrigado pela ajuda: aprendi algo interessante com esse problema!
fonte
Respostas:
A partir dos comentários, o problema não está exatamente na tabela ou na maneira como o SQLCMD importa os caracteres especiais. Geralmente, importações problemáticas estão relacionadas ao formato do próprio script.
O próprio Management Studio oferece a opção de salvar com uma codificação específica, que deve resolver o problema no futuro. Ao salvar um arquivo pela primeira vez (ou use salvar como), clique na pequena seta próxima ao botão Salvar , para usar a opção Salvar com codificação .
Por padrão, ele salva o arquivo na Europa Ocidental (1252) . Sempre que tenho caracteres especiais, uso UTF8 (embora talvez alguma outra codificação restritiva se encaixe) porque geralmente é a correção mais rápida.
Não tenho certeza (da foto) de que você está usando SSMS; portanto, verifique se o seu próprio editor tem a opção de salvar o arquivo em uma codificação diferente. Caso contrário, a conversão do arquivo em um editor inteligente (como você já tentou no Notepad ++) geralmente funciona. Embora isso possa não funcionar se você estiver convertendo de uma codificação ampla para uma mais estreita e depois voltar para uma ampla (por exemplo: de Unicode para ANSI e de volta para Unicode).
fonte
Outra opção, uma que eu só aprendi, vem a
sqlcmd
documentação . Você precisa definir a página de código parasqlcmd
corresponder à da codificação do arquivo. No caso de UTF-8, a página de códigos é 65001, então você deseja:SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001
fonte
Esse tipo de coisa é muito complicado, porque muito é feito sem contar a você.
A primeira coisa que eu faria é usar o sqlcmd para exibir a string. Se ele for exibido corretamente na janela do cmd.exe, esse é um fato útil. Em seguida, selecionaria a linha
convert
da string para varbinary para ver quais bytes estão realmente lá. Acho que a cartografía aparecerá como0x636172746f67726166c3ad61
, onde o "i" acentuado é representado pelos bytes c3ad, que é a codificação UTF-8 para esse caractere. Não é bom ter UTF-8 em uma coluna em espanhol moderno (Windows 1252). O valor de byte no Windows 1252 para esse caractere é 237 decimal (hex ED).Se a coluna contiver dados codificados incorretamente, o erro está na forma como foram inseridos. Talvez a remoção do N principal nas constantes da string -
N'string'
diga ao SQL Server para gerar uma string Unicode, mas simples'string'
indica que os caracteres usam a codificação do cliente - inserindo o espanhol moderno em vez do Unicode.Se a coluna contiver dados codificados corretamente, eu diria que você encontrou um bug na exibição da GUI.
Se você não conseguir que o sqlcmd insira os dados corretamente (N inicial ou não), você deverá reclamar com a Microsoft. Ao fazê-lo, ser capaz de mostrar os bytes armazenados na coluna - usando
convert(colname as varbinary)
- será fundamental para explicar o que está acontecendo de errado.fonte