web-dev-qa-db-ja.com

SQL Server 2012で大文字と小文字の区別を無効にする方法は?

更新しようとしましたcollation_name in sys.databases。テーブルで大文字と小文字の区別を無効にするために、「SQL_Latin1_General_CP1_CS_AS」を「SQL_Latin1_General_CP1_CI_AS」に変更しようとしています。

update d set d.collation_name='SQL_Latin1_General_CP1_CI_AS'
--SELECT name, collation_name 
FROM sys.databases d
WHERE name = 'db_name' 

ただし、次のエラーが発生します。

メッセージ259、レベル16、状態1、行1
システムカタログへのアドホック更新は許可されていません。

2
Mongfu

まず、今見たように、システムビューでメタデータを直接変更することはできません。ただし、 ALTER DATABASE を使用して、特定のデータベースの設定を変更できます。

ALTER DATABASE { database_name  | CURRENT }
  COLLATE collation_name;

CURRENTキーワードを使用するオプションは、SQL Server 2012で導入されたことに注意してください。

または、特定のテーブルの特定のフィールドがすべてのクエリに対してどのように動作するかを変更するだけの場合(まあ、すべてがCOLLATE句でフィールドの照合をオーバーライドしないものです-下記の注を参照)これを行うには、その1つのフィールドの照合順序を変更します。

ALTER TABLE [TableName]
  ALTER COLUMN [ColumnName] NVARCHAR(10)
  COLLATE Latin1_General_100_CI_AS
  NOT NULL;

フィールドに現在あるのとまったく同じデータ型とNULLとNOT NULLの設定を必ず指定してください!!

今、あなたが達成しようとしていることについてのいくつかのメモ:

  • SQL_で始まる照合は非推奨です。 Windows照合順序を使用する必要があります。この場合、Latin1_General_100_CI_ASを使用します。 _100シリーズは最新バージョンであり、SQL Server 2008で導入されました。

  • データベースのデフォルトの照合順序を変更しても、既存のテーブルの文字列フィールドの照合順序は変更されません。これは、文字列リテラルと変数が関係する操作にのみ影響し、照合がすでに指定されているテーブルのフィールドも関係しません。テーブルが既に存在する場合のデータベースの照合順序の変更による影響の詳細(文字列フィールドで既存のテーブルと新しいテーブルを結合した場合の潜在的なエラーを含む、実際の効果を示すコード例を含む)については、ここで私の回答を参照してください: データベースのデフォルトの照合順序を変更すると、Latin1_General_BINのパフォーマンスに影響します

  • 文字列操作は、リテラル、変数、テーブルのフィールドのいずれを含むかに関係なく、 [〜#〜] collat​​e [〜#〜] 句を使用してデフォルトの照合をオーバーライドできます。例えば:

    SELECT *
    FROM   dbo.SomeTable st
    WHERE  st.SomeField = @StoredProcedureParameter COLLATE Latin1_General_100_CI_AS;
    

    一部(すべてではない)のテーブルに対する一部(すべてではない)のクエリのみを懸念している場合は、ここから始めてください。

  • 文字列操作に実際に使用される照合は、照合を指定する場所のさまざまなレベルを調べることによって決定されます。詳細は 照合順序 を参照してください。

7
Solomon Rutzky