Команда SQLCMD не може вставити наголоси


19

Я намагаюся запустити sqlcmd.exe для встановлення нової бази даних з командного рядка. Я використовую SQL SERVER Express 2012 у Windows 7 64 біт.

Ось команда, яку я використовую:

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

Ось фрагмент сценарію створення файлу 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'

Ну, будь ласка, перевірте, чи є наголоси на словах; що є описом таблиці. База даних створюється без проблем. "Співставити" розуміють сценарій, як ви бачите на доданому скріншоті. Незважаючи на це, при вивченні таблиці наголоси не відображаються належним чином.Проблема зібрання

Я дуже вдячний за будь-яку допомогу. Велике спасибі.

[Редагувати]: Привіт усім. Зміна кодування файлів SQL за допомогою Notepad ++ працювала чудово! Дуже дякую за допомогу: я дізнався щось цікаве з цією проблемою!

введіть тут опис зображення


1
Що таке кодування файлу сценарію SQL?
Pondlife

Я б пішов з ідеєю @ Pondlife. Візьміть текстовий редактор (наприклад, Блокнот ++), відкрийте там. Якщо це так, виберіть конвертувати файл у щось інше. Я б сказав, що UTF8 повинен це зробити. Дайте нам знати, як це пішло.
Мар’ян

Відповіді:


8

Що стосується коментарів, проблема полягає не в тому, що саме з таблицею чи способом SQLCMD імпортує спеціальні символи. Зазвичай проблемний імпорт пов'язаний з форматом самого сценарію.

Сама студія управління пропонує можливість збереження за допомогою конкретного кодування, що повинно вирішити проблему в майбутньому. Під час першого збереження файлу (або використання зберегти як) слід натиснути на маленьку стрілку біля кнопки « Зберегти », щоб скористатися опцією « Зберегти за допомогою кодування» .

введіть тут опис зображення

За замовчуванням він зберігає файл у західноєвропейській (1252) . Щоразу, коли у мене є якісь спеціальні символи, я використовую UTF8 (хоча, можливо, підійде якесь інше обмежувальне кодування), оскільки це, як правило, найшвидше виправити.

введіть тут опис зображення

Я не впевнений (на малюнку), що ви використовуєте SSMS, тому переконайтесь, що ваш власний редактор має можливість зберегти файл у іншому кодуванні. Якщо ні, то конвертування файлу в розумному редакторі (як ви вже пробували в Notepad ++), як правило, працює. Хоча це може не спрацювати, якщо ви перетворюєте з широкого кодування в більш вузьке, а потім повертаєтеся до широкого (наприклад: з Unicode в ANSI і назад в Unicode).


Привіт Маріан. Ще раз дякую вам. Я використовував функцію "Передача даних" від Navicat, тому що мені подобається те, як вона генерує скрипт sql (швидкий, mdf-файл незалежний, і оскільки він завжди працював для мене). Я перевірив деякі параметри у функції "Передача даних" в Navicat, але не знайшов жодного способу зміни кодування вихідних файлів. Мені доведеться виконати додаткову роботу, використовуючи Notepad ++, щоб змінити кодування, але це не велика справа.
Оскітар

Ну, ніяких проблем. Хоча, звичайно, подяки на цьому веб-сайті надсилаються за допомогою функції Upvote (стрілка вгору біля відповіді), якщо відповідь корисна, або, якщо вона повністю вирішує вашу проблему, навіть використовуючи позначку як відповідь (галочка біля відповіді ) :-). Детальніше дивіться тут, у FAQ .
Маріан

Я виправляю свій останній коментар: МОЖНА обрати кодування вихідного файлу під час виконання "Передачі даних" з Navicat.
Оскітар

Класно, тому тепер ви зможете обійти крок перетворення вручну. Це ще краще.
Мар’ян

2
Ця відповідь здається невірною. У мене був збережений файл Notepad ++ у UTF-8. SQLCMD.exe неправильно передає символи. Якщо я скопіюю вміст у SSMS, він справно працює. Справжнім рішенням була відповідь, яку надав swasheck, щоб додати параметр -f 65001.
Tomas Kubes

39

Ще один варіант, який я тільки що дізнався, походить до sqlcmdдокументації . Вам потрібно встановити сторінку коду, sqlcmdщоб вона відповідала кодуванню файлу. У випадку UTF-8 кодова сторінка становить 65001, тому вам потрібно:

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


1
Це просто врятувало мені життя, я вже збирався зробити скрипт повноважень, щоб прочитати файл CSV з імпортуванням-csv -кодування UTF8. Спасибі
Spörri

Це спрацювало для мене, коли мені довелося вставити ірландські текстові значення з fadas (á, é, í, ó, ú) у колонку NVARCHAR
полудень

Це правильна відповідь
Пітматт

2

Такі речі дуже складні, тому що стільки робиться, не розповідаючи.

Перше, що я б зробив, це використовувати sqlcmd для відображення рядка. Якщо воно вірно відображається у вікні cmd.exe, це один корисний факт. Далі я б convertобрав рядок з рядком у varbinary, щоб побачити, які байти є насправді. Я думаю картографія відобразиться як 0x636172746f67726166c3ad61, де наголошене "i" представлено байтами c3ad, що кодує UTF-8 для цього символу. Недоцільно мати UTF-8 у колоні сучасної іспанської мови (Windows 1252). Значення байту в Windows 1252 для цього символу становить 237 десятків (шестнадцятковий ED).

Якщо стовпець містить неправильно кодовані дані, то помилка полягає в тому, як він був вставлений. Можливо, видалення провідних N у константах рядка -N'string' говорить SQL Server, щоб генерувати рядок Unicode, але просте 'string'вказує, що символи використовують кодування клієнта - вставив би сучасну іспанську мову замість Unicode.

Якщо стовпець містить правильно закодовані дані, то я б сказав, що ви знайшли помилку на дисплеї GUI.

Якщо ви не можете отримати sqlcmd, щоб правильно вставити дані (ведучі N чи ні), ви хочете подати скаргу в Microsoft. Коли ви це зробите, можливість відображення байтів як збережених у стовпці - використовуючи convert(colname as varbinary)- буде вирішальним для пояснення того, що відбувається не так.


Привіт Джеймс, дуже дякую за детальну відповідь. Я зробив кілька тестів, і Sqlcmd.exe не відображає правильний рядок. Очевидно, що проблема вставляється в дані.
Оскітар

Використовуючи Sql Profiler, я налагодив, які речення надсилаються до SQL SERVER при використанні клієнтського інтерфейсу GUI сервера SQl. ВСТАВИТИ В [ElementType] ([Код], [Ім'я], [Опис], [GeometryType], [stringId], [CapturedGeometryType]) ВАЛЮТИ ('ESTACION', 'Estación', 'Estación', 'Multipoint', NULL, 'Точка'); працював FINE, тому всі акценти були правильно вставлені !. Це те саме "вставити речення", яке з’являється в моєму сценарії sql. Чи слід вказати код символу у файлі скрипту sql?
Оскітар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.