私は数年前から MS SQL を扱っていますが、前職ではこのようなことは一度もありませんでした。しかし、私が今働いている場所では、原因を知りたいエラーが発生しました。
私はストアド プロシージャを作成し、いくつかのパラメーターを使用して Delphi 5 (そうです) アプリで呼び出しました。これは、2 つのデータベース (異なる時間からのコピー) で正常に機能しました。しかし、別のDB(再びコピー)で試してみましたが、次のエラーが発生しました:
Cannot resolve the collation conflict between "Latin1_General_CI_AS" and
"SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
これは、一時テーブルを作成してからデータを挿入しようとすることで得られました。私も加入していません。そして面白いことに、WHERE 句全体を削除すると、機能します。そのままにしておくと (パラメーターを 1 つのテーブルと比較するだけですが)、失敗します。
create table #TOP (EDAID int, ParentID char(30), ChildID char(30),
Position int, OrgQty_modified_manually bit)
これは失敗します:
insert into #TOP
select EDAID, ParentID, ChildID, Position, OrgQty_modified_manually
from EDA_SOBOM
where OrderNr = @OrderNr
and Position = @Position
and LN = @LN
and DL = @DL
and rtrim(ChildID) = @CurrentPart
and rtrim(ParentID) = @ParentID
これは機能します:
insert into #TOP
select EDAID, ParentID, ChildID, Position, OrgQty_modified_manually
from EDA_SOBOM
プロシージャ パラメータは次のように宣言されます: @PartID char(30)、@Position int、@OrderNr char(8)、@LN char(2)、@DL char(2)、@ParentID char(30)、@Modified bit出力
私はここで解決策を見つけました: Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation .
だから私はCREATEの直後にこれを追加しました:
ALTER TABLE #TOP
ALTER COLUMN ParentID
VARCHAR(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
ALTER TABLE #TOP
ALTER COLUMN ChildID
VARCHAR(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
そして、それですべてが再び機能しました...しかし、パラメーター比較のみのWHERE句が失敗する理由がわかりません...パラメーターにも照合がありますか?
DB には照合 SQL_Latin1_General_CP1_CI_AS があります。テーブル EDA_SOBOM には、char 列の照合 SQL_Latin1_General_CP1_CI_AS もあります。次のクエリでこれを見つけました。
SELECT col.name, col.collation_name
FROM sys.columns col
WHERE object_id = OBJECT_ID('EDA_SOBOM')
DBレベルやカラムレベルとは別に照合できるところはありますか?
何が起こっているのだろうか...