web-dev-qa-db-ja.com

SQL Serverは、クエリで照合タイプを複数回繰り返すことを避けます

ソースデータベース(データベースA)から行を選択し、それらをターゲットデータベース(データベースB)に挿入するクエリがあります。照合タイプはデータベース間で異なり、変更できません。 varcharフィールドの照合順序を明示的に指定して、クエリの照合順序の違いに対処する必要があります。

現在、私のクエリは次のようになります。

INSERT INTO DatabaseB.dbo.Users(
    Id,
    UserNumber,
    FirstName,
    Surname,
    Address1,
    Address2,
    AddressTown,
    AddressCity
)
SELECT 
    Id,
    UserNumber,
    FirstName COLLATE SQL_Latin1_General_CI_AS,
    Surname COLLATE SQL_Latin1_General_CI_AS,
    Address1 COLLATE SQL_Latin1_General_CI_AS,
    Address2 COLLATE SQL_Latin1_General_CI_AS,
    AddressTown COLLATE SQL_Latin1_General_CI_AS,
    AddressCity COLLATE SQL_Latin1_General_CI_AS
FROM DatabaseA.dbo.Users

私の質問は、すべての文字列ベースのフィールドに照合タイプを入力することを回避できますか?クエリ全体の照合タイプを一度に指定できる方法はありますか?これが不可能な場合、他のショートカットはありますか?

8
Laurence Frost

次のような列定義を使用して、ビューを作成できます。

FirstName COLLATE SQL_Latin1_General_CI_AS, ...

その後、いつでもユーザーテーブルを使用したい場合は、代わりにこのビューを使用できます。

9
sepupic

照合順序は、各文字列の列/式ごとです(XMLデータ型は除外されます)。そのため、この意味では、テーブルまたはクエリごとに照合順序を設定することはできません。

Varcharフィールドの照合順序を明示的に指定して、クエリの照合順序の違いに対処する必要があります。

えっと、なぜ? INSERTステートメントでこれに対処する必要はありません。照合の競合は、2つの列を比較するとき、またはUNIONで2つ以上の列を組み合わせるときに発生します。以下のテストでわかるように(tempdbではないデータベースで実行するだけです)、2つのテーブルがあり、それぞれが異なるデータベースにあり、それぞれに異なる照合順序があり、1つはSQL Server照合順序です1つはWindows照合順序であり、エラーはありません。エラーが発生した場合は、質問に詳細を入力してください。

--DROP TABLE #tmp;
CREATE TABLE #tmp (Col1 VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS);
INSERT INTO #tmp ([Col1]) VALUES ('n');

-- DROP TABLE dbo.Tmp;
CREATE TABLE dbo.Tmp (Col1 VARCHAR(50) COLLATE Hebrew_100_CS_AI);

INSERT INTO dbo.Tmp ([Col1])
  SELECT t.[Col1]
  FROM #tmp t;
5
Solomon Rutzky