Estou tentando executar o sqlcmd.exe para configurar um novo banco de dados a partir da linha de comando. Estou usando o SQL SERVER Express 2012 no Windows 7 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á um pedaço 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; que é a descrição da tabela. O banco de dados é criado sem problemas. 'Collate' é entendido pelo script, como você pode ver na captura de tela anexada. Apesar disso, os acentos não são mostrados adequadamente 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 este problema!
Outra opção, que acabei de aprender, vem da
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ódigo é 65001, então você deseja:SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001
Pelos comentários, o problema não está exatamente na tabela ou na forma como o SQLCMD importa os caracteres especiais. Normalmente, as 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, o que deverá resolver o problema no futuro. Ao salvar um arquivo pela primeira vez (ou usar salvar como) você deve clicar 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 algum caractere especial, 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) se você está usando o SSMS, portanto, certifique-se de que seu próprio editor tenha a opção de salvar o arquivo em uma codificação diferente. Caso contrário, converter o 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 de volta para uma ampla (por exemplo: de Unicode para ANSI e de volta para Unicode).
Esse tipo de coisa é muito complicado, porque muito é feito sem lhe dizer.
A primeira coisa que eu faria é usar o sqlcmd para exibir a string. Se ele for exibido corretamente na janela cmd.exe, esse é um fato útil. Em seguida, eu selecionaria a linha
convert
da string para varbinary para ver quais bytes estão realmente lá. Acho que cartografía aparecerá como0x636172746f67726166c3ad61
, onde o "i" acentuado é representado pelos bytes c3ad, que é a codificação UTF-8 para esse caractere. Não adianta 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 contém dados codificados incorretamente, o erro está em como foi inserido. Talvez a remoção do N inicial nas constantes de 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 - inseriria o espanhol moderno em vez de Unicode.Se a coluna contém 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 (à esquerda ou não), então você quer reclamar com a Microsoft. Quando você fizer isso, ser capaz de mostrar os bytes armazenados na coluna -- using
convert(colname as varbinary)
-- será fundamental para explicar o que está acontecendo de errado.Isso funcionou para mim, mas por algum motivo o comando -f 65001 não funcionou.