ソースデータベース(データベース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
私の質問は、すべての文字列ベースのフィールドに照合タイプを入力することを回避できますか?クエリ全体の照合タイプを一度に指定できる方法はありますか?これが不可能な場合、他のショートカットはありますか?
次のような列定義を使用して、ビューを作成できます。
FirstName COLLATE SQL_Latin1_General_CI_AS, ...
その後、いつでもユーザーテーブルを使用したい場合は、代わりにこのビューを使用できます。
照合順序は、各文字列の列/式ごとです(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;