web-dev-qa-db-ja.com

SQLCMDコマンドはアクセントを挿入できません

コマンドラインから新しいデータベースをセットアップするためにsqlcmd.exeを実行しようとしています。 Windows 7 64ビットでSQL SERVER Express 2012を使用しています。

これが私が使うコマンドです:

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'

単語にアクセントがあることを確認してください。これはテーブルの説明です。データベースは問題なく作成されています。添付のスクリーンショットでわかるように、「照合」はスクリプトによって理解されます。これにもかかわらず、テーブルを調べるときにアクセントが適切に表示されません。Collation problem

私は本当にどんな助けにも感謝します。どうもありがとうございました。

[編集]:こんにちは。 Notepad ++を使用したSQLファイルエンコーディングの変更は問題なく機能しました。助けてくれてありがとう:この問題で面白いことを学びました!

enter image description here

20
Oskytar

コメントからわかるように、問題はテーブルまたはSQLCMDが特殊文字をインポートする方法に正確ではありません。通常、問題のあるインポートはスクリプト自体の形式に関連しています。

Management Studio自体は、特定のエンコーディングで保存するオプションを提供しており、将来の問題を解決するはずです。初めてファイルを保存するとき(または名前を付けて保存を使用するとき)は、オプションエンコード付きで保存を使用するために保存ボタンの近くにある小さな矢印をクリックする必要があります。

enter image description here

デフォルトでは、ファイルはWestern European(1252)で保存されます。特別な文字があるときはいつでも、UTF8を使用します(ただし、他の制限的なエンコーディングが適合する可能性があります)。

enter image description here

SSMSを使用していることが(写真から)わからないので、独自のエディターにファイルを別のエンコードで保存するオプションがあることを確認してください。そうでない場合は、スマートエディタでファイルを変換することで(Notepad ++で既に試したように)、通常は機能します。ただし、ワイドエンコーディングからナローエンコーディングに変換してからワイドエンコーディングに戻す場合(たとえば、UnicodeからANSIに、さらにUnicodeに戻す場合)は機能しない可能性があります。

9
Marian

別のオプションは、私が今学んだものですが、 the sqlcmd documentation からのものです。 sqlcmdのコードページをファイルエンコーディングのコードページと一致するように設定する必要があります。 UTF-8の場合、コードページは65001なので、次のようにします。

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

41
swasheck

このようなことは非常にトリッキーです。なぜなら、多くのことはあなたに言わずに行われるからです。

最初に行うことは、sqlcmdを使用して文字列を表示することです。それがcmd.exeウィンドウに正しく表示される場合、それは1つの有用な事実です。次に、文字列convertingからvarbinaryへの行を選択して、実際にそこにあるバイトを確認します。 cartografíaは_0x636172746f67726166c3ad61_として表示されると思います。アクセント付きの「i」は、その文字のUTF-8エンコーディングであるバイトc3adで表されます。現代スペイン語の列(Windows 1252)でUTF-8を使用するのはよくありません。その文字のWindows 1252のバイト値は、10進237(16進ED)です。

列が誤ってエンコードされたデータを保持している場合、エラーはその挿入方法にあります。おそらく、文字列定数の先頭のNを削除します-_N'string'_はSQL ServerにUnicode文字列を生成するように指示しますが、プレーンな_'string'_は文字がクライアントのエンコーディングを使用することを示します-Unicodeではなくモダンスペイン語を挿入します。

列が正しくエンコードされたデータを保持している場合、GUI表示にバグを見つけたと言えます。

Sqlcmdでデータを正しく挿入できない場合(先頭のNかどうか)は、Microsoftに不平を言う必要があります。その場合、convert(colname as varbinary)を使用して、列に格納されているバイトを表示できることが、何が問題なのかを説明する上で重要になります。

2
James K. Lowden

これは私にとってはうまくいきましたが、何らかの理由でコマンド-f 65001がうまくいきませんでした。

sqlcmd -s serverName -f i:1252 -i c:\sqlUpdate.sql -f o:65001 -o c:\sqlUpdateOutput.sql -d userDatabaseName
0
Tequila