web-dev-qa-db-ja.com

SQL Server ManagementStudioのデフォルトのエンコーディング

最近、ラップトップにSSMS2008を再インストールしました

[新しいクエリ..]をクリックすると、ファイルのエンコーディングを選択するように求められます。これは、これまで求められたことのないことです。

オプションのテキストエディタセクションで「SQLクエリエディタとエンコーディング」にSQLを再度関連付け、SSMSを再起動しました

新しいクエリを実行したり、既存のSQLファイルを開いたりするたびに選択したくないので、エンコーディングに関連付けるにはどうすればよいですか?

9
Mike

私はそのようなばかです-私は関連付けを「SQLクエリエディタ」に変更しました、そしてそれは今すべてうまくいく

「withEncoding」ビットは本当に私をひっくり返したはずです!

1
Mike

Fakher Halimが Microsoft Azureフィードバックフォーラム に投稿した回避策によると。

私も同じ問題を抱えていました。 Gitは履歴に違いを表示しませんでした(「バイナリファイルa /x.sqlとb/x.sqlが異なることを除いて)。そこで、[ツール] => [オプション] => [環境] => [国際設定]をクリックしました。言語を「英語」から変更しました。 「MicrosoftWindowsと同じ」に。GITDIFFが完全に機能するようになりました。バージョンの違いが正常に報告されます。

6
meh-uk

他の場所で提供されたアドバイスに基づく( https://feedback.Azure.com/forums/908035-sql-server/suggestions/32892454-need-a-way-to-set-the-default-encoding-for -query-f )「コマンドスクリプト」をハッキングして、BOMを使用して「デフォルトのエンコーディングをUTF-8に変更」しようとしました。このスクリプトは、SQLServerのProgramFilesツリー内のSQLFile.sqlファイルにUTF-8w/BOMテンプレートを書き込むことで機能します。私のマシンでは一度は動作しましたが、バグがない、または100%安全であるという意味ではありません。使用AT自己責任!

そのスレッドでの「Microsoftの」応答によると:

ファイルの保存方法のデフォルトは、C:\ Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE\sqlworkbenchprojectitems\SqlにあるメインテンプレートファイルSQLFile.sqlによって決まります。 ANSIエンコーディングを使用してこのファイルを保存すると、後続の新しいクエリセッションでこのエンコーディングが使用されます。

私のマシンでは別のパスでテンプレートを見つけたので、いずれかのProgram Filesでその名前に一致するanyファイルを見つけるスクリプトを作成したことに注意してください。誤った衝突はめったにないはずの、ばかげた名前のようです。

引数(または期待以外の引数)が渡されなかった場合は、ドライランを実行する必要があります。必ず最初に管理者権限なしで実行してください。少なくとも該当するファイルが見つかるので、スクリプトを続行するか、ファイルを自分で変更するかを決定できます。

スクリプトを実際に実行するには、「force」の最初の引数を渡します。これは危険な部分です。注意してください。ユーザー入力を一時停止せずにスクリプトを最後まで実行するには、「dontpause」の2番目の引数を渡します(これは、空の最初の引数を指定して渡すと、ドライラン中の一時停止をスキップできます)。

UTF-8を選択したのは、7ビットASCIIと互換性があり、スクリプトを作成する必要のある言語と文字の大部分をサポートし、西洋のテキストとソースコードを非常に効率的に保存できるためです。スクリプトの下部にあるテンプレートには、ISO-8859-1またはその他の互換性のないデフォルトの8ビットエンコーディングではないことを編集者に通知するためのバイトオーダーマーク(BOM)が含まれています。コピー/貼り付け時に失われることはありません。実際のバッチスクリプトをASCII(または互換性あり。BOMなし!)として保存します。コマンドプロセッサはUTF-8BOMでチョークします。

@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION || exit /b 1

if "x%1" == "xforce" (
    echo Force enable. Danger Will Robinson! This means that I'm going to
    echo attempt to move files and write a new file to replace them. This
    echo is potentially destructive if there are any bugs in this script.
    echo In particular, if there are any unrelated files with the name
    echo sqlfile.sql under your Program Files directories then they'll be
    echo corrupted.
    echo.
    echo This script is going to require elevated privileges to write to
    echo Program Files. Execute the Command Prompt application as an
    echo administrator to proceed ^(should be harmless to try without
    echo elevation first^).
    echo.
    echo I RECOMMEND YOU _DO NOT_ RUN THIS SCRIPT FROM WINDOWS Explorer
    echo BECAUSE YOU MAY HAVE A HARDER TIME READING THE OUTPUT. Start a
    echo Command Prompt and run it there.
    echo.

    if not "x%2" == "xdontpause" (
        echo Now is a good time to Ctrl+C ^(and Y^).
        pause
    )
) else (
    echo Dry-run enabled. Pass a lone argument of "force" to go for real. 1>&2
    echo Be careful running the script several times. Your template backup
    echo will be overwritten and lost.
)

set paths="C:\Program Files (x86)\SQLFile.sql" "C:\Program Files\SQLFile.sql"

for /f "tokens=*" %%f in ('dir /a /b /s %paths% 2^>NUL') do @(
    echo.
    echo Found: %%f

    if "x%1" == "xforce" (
        echo Moving to: %%f.orig
        echo.
        echo If you ^(or anything else^) has made any changes to your template
        echo then you should be able to recover your template from the backup
        echo file above ^(not yet, once you continue^) ^(alternatively,
        echo recover the template from the source file now^).

        if not "x%2" == "xdontpause" (
            pause
        )

        move "%%f" "%%f.orig" || exit /b 1
    )

    echo.
    echo Writing a standard UTF-8 template with byte-order mark ^(BOM^).
    echo Feel free to open this file up afterward and manually set the
    echo encoding preferred. You can also replace it with your own
    echo template text.

    if not "x%2" == "xdontpause" (
        pause
    )

    set ok=0

    rem Read in myself, look for the __BEGIN__ marker and write
    rem subsequent lines to the file.
    for /f "tokens=*" %%g in (%~dpf0) do @(
        if !ok! == 1 (
            if "x%1" == "xforce" (
                if "x%%g" == "x." (
                    echo.
                    echo.>>"%%f"|| exit /b 1
                ) else (
                    echo %%g
                    echo %%g>>"%%f"|| exit /b 1
                )
            )
        ) else (
            if "%%g" == "__BEGIN__" (
                echo.
                echo Found marker. Starting write on next ^(non-empty^) line... 1>&2
                echo.
                set ok=1
            )
        )
    )
)

exit /b 0

Below is the SQL template. Lines containing only a dot (.) represent
blank lines. Actual blank lines will be lost.

__BEGIN__
BEGIN TRANSACTION;
.
SET XACT_ABORT ON;
.
.
.
ROLLBACK;
--COMMIT;
4
bambams

以前の回答では、[ツール]→[オプション]→[環境]→[国際設定]の使用が提案されていましたが、このオプションはSSMS17.2にはありません。

代わりに、[ファイル]→[名前を付けて保存...]に移動し、[保存]ボタンの矢印をクリックして、[エンコードで保存]を選択します。

3
Filip Yaghob

SQL Server Management Studioで、[ツール/オプション]を選択し、[テキストエディター]を展開して拡張子「sql」を追加し、「SQLクエリエディター」にマップします。

ASCII文字を使用している場合、ソリューションは機能します。SQLエディターで決定された明示的なエンコードが必要な文字がSQLに含まれている場合は、エンコードを選択する必要があります。問題が発生します。 SQLエディターと他のエディター(NotePad ++)の両方でファイルを作成し、それらのファイルを他のエディターで編集する場合、NotePad ++はヘッダーなしでファイルを保存し、エンコードを推測できます。一方、SQLエディターでは、特定の場合は常にエンコードヘッダーが必要です。文字が使用されます。

1
LeeLep