質問: 私が使用するDBはFrench_CI_ASの照合を持っています(CIは大文字小文字を区別しません)が、大文字と小文字を区別します。私はなぜそれを理解しようとしています。 私がこれを主張した理由は、 'GIVEN'の大文字小文字の設定が失敗したばかりの一括挿入が失敗したが、別の 'Given'の大文字小文字の設定が成功したためである。 例えば: * `INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES ("value1", "value2")`失敗しますが、 * `INSERT INTO SomeTable([Given],[ColName]) VALUES ("value1", "value2")`機能します。 **編集**これを見た: そのため、すべてのデータを空にして関連テーブルを再作成することなく、列の照合順序を変更することができるはずです。
回答: この重要な情報が与えられれば(それは実際の質問*で*はなく、質問に関するコメントにあります) > 実際にはMicrosoftの.Netの一括挿入メソッドを使用しているため、DBサーバーに送信する正確なクエリは実際には分かりません。 > > 大文字小文字を区別しないDBであっても、列名は大文字と小文字を区別して扱われていることが理にかなっています`SqlBulkCopy`クラスがどのように`SqlBulkCopy`するかということです。 SqlBulkCopyの列マッピングでは大文字と小文字が区別されますを参照してください。 **その他の注意事項** 1. エラーを尋ねるときは、常に*実際の* *完全な*エラーメッセージを質問に含めてください。間違いがあったと言うだけで、多くの推測や野生のガチョウの追跡が起こり、それが話題外の解答につながります。 2. 質問するときは、あなたが対処している状況を変更しないでください。たとえば、問題の状態(重点が追加されています): > 「が指定」ケースのセットアップと*一括挿入は*失敗しますが、それらは別の「考える」ケースのセットアップに成功します。 > > ただし、この例文は単一の`INSERT`です。また、この質問に対するコメントは次のように述べている。 > 実際にはMicrosoftの.Netの一括挿入メソッドを使用しているため、DBサーバーに送信する正確なクエリは実際には分かりません。 > > .NETと`SqlBulkCopy`を使用すると、 `BULK INSERT`または`INSERT`を使用するよりも現在の質問が誤解を招き、正しく答えることが困難(または不可能)になることがあります。 `SqlBulkCopy`を使用する場合は、 `INSERT`文を記述しないため、 `SELECT`文を記述して宛先表の名前を指定するだけで`SqlBulkCopy`ため、この新しい情報でも多くの疑問が生じます。宛先表に対して列名を指定した場合は、オプションの列マッピングに含まれます。問題はどこにあるの? 3. 質問の「編集」セクションについて: いいえ、 `SqlBulkCopy`を使用していなくても、列の照合順序を変更することはまったく`SqlBulkCopy`ません。列の照合は、列名(つまり表のメタデータ)の動作ではなく*、列に格納されたデータの*動作を決定し*ます* 。データベースレベルのオブジェクトメタデータの動作を決定するのは、データベース自体の照合です。この場合、DBは大文字小文字を区別しない照合を使用していると主張します(照合名の`_CI_`部分は " **C** ase **I** nsensitive" **を**意味します)。 4. ジョナサン・レフラー(Jonathan Leffler)が次のような疑問を述べたことについて: > 区切られた識別子(通常は大文字と小文字を区別)と照合(これは大文字と小文字を区別しません)間のやりとりの非常に繊細な領域に入ります。 > > いいえ、区切り識別子は大文字と小文字を区別しません。区切られた識別子の感度(大文字、アクセント、仮名、幅、およびSQL Server 2017バリエーションセレクタの開始点)は、同じレベルの区切りのない識別子の場合と同じです。 「同じレベル」とは、インスタンスレベルの名前(データベース、ログインなど)がインスタンスレベルの照合によって制御され、データベースレベルの名前(スキーマ、オブジェクト - テーブル、ビュー、関数、ストアドプロシージャなど)ユーザーなど)は、データベースレベルの照合によって制御されます。これらの2つのレベルは、異なる照合を持つことができます。 > 区切り文字付きでデータベースのSQL列名が大文字小文字を区別するかどうかを調べる必要があります。また、CREATE TABLEステートメントがどのように記述されているか(名前はその中で区切られていますか?)通常、SQLは列名と表名で大文字と小文字を区別しません。あなたは`INSERT INTO SoMeTaBlE(GiVeN, cOlNaMe) VALUES("v1", "v2")`を書くことができ、名前が区切られていなければOKです。 > > テーブルの作成時に列名が区切られているかどうかは問題ではありません。少なくとも、その解像度の処理方法に関しては関係ありません。列名はデータベースレベルのメタデータで、デフォルトのデータベース照合によって制御されます。また、各データベース内のすべてのデータベースレベルのメタデータについても同じです。大文字と小文字を区別しない列名と、大文字と小文字を区別しない列名を区別することはできません。 また、表名と列名には特別なものはありません。これらは、ユーザー名、スキーマ名、インデックス名などと同様のデータベースレベルのメタデータです。このメタデータはすべて、データベースのデフォルトの照合順序によって制御されます。 メタデータ(インスタンスレベルとデータベースレベルの両方)は、インストール中に大文字と小文字を区別しない照合であることを示すデフォルト照合のため、大文字と小文字を区別しません。 > 'delimited identifier'は、列名、表名、または二重引用符で囲まれたCREATE TABLE "table"(...)のようなものです。 > > 区切られた識別子は、問題のDBMSがその区切り文字として定義した文字で囲まれた識別子であると言うのがより正確です。区切り文字に使用される特定の文字は、異なるDBMSによって異なります。 > SQL Serverでは、区切られた識別子は角カッコで囲まれています。[GIVEN] > > 角括弧は常に識別子の区切り文字として機能しますが、 `QUOTED_IDENTIFIER`セッションレベルプロパティが`ON`設定されている場合は、区切り文字として二重引用符を使用することができます(いずれにしても常に最善です)。 > SQLには不可解な部分があります(区切られた識別子の処理もその1つです) > > まあ、区切られた識別子は実際には非常に単純です。識別子を区切る全般的なポイントは、規則的な(すなわち、区切られていない)識別子の規則を効果的に無視することである。しかし、通常の識別子の点では、そうしたルールは(むしろ公式の文書が不完全で不正確であるために)かなり難解です。だから、SQL Serverの識別子が実際にどのように機能するかを知るために、私はたくさんの研究を行い、ここに結果を発表しました(これには研究自体へのリンクが含まれています)。 T-SQL識別子の規則の完全なリストを完成する Collations / Encodings / Unicode / ASCIIの詳細については、特にMicrosoft SQL Serverに関連していますので、 Collations.Info