web-dev-qa-db-ja.com

一時テーブルの照合の競合-エラー:Latin1 *とSQL_Latin1 *間の照合の競合を解決できません

一時テーブルを更新できません。これは私のクエリです

CREATE TABLE #temp_po(IndentID INT, OIndentDetailID INT, OD1 VARCHAR(50), OD2 VARCHAR(50), 
        OD3 VARCHAR(50), ORD VARCHAR(50), NIndentDetailID INT, ND1 VARCHAR(50), ND2 VARCHAR(50), 
        ND3 VARCHAR(50), NRD VARCHAR(50), Quantity DECIMAL(15,3))

        INSERT INTO #temp_po(IndentID, OIndentDetailID, OD1, OD2, OD3, ORD)
        SELECT ID.IndentID, ID.IndentDetailID, ID.D1, ID.D2, ID.D3, ID.RandomDimension 
        FROM STR_IndentDetail ID WHERE ID.IndentID = @IndentID

        UPDATE 
            t 
        SET
            t.ND1 = CASE WHEN D.D1 = '' THEN NULL ELSE D.D1 END,
            t.ND2 = CASE WHEN D.D2 = '' THEN NULL ELSE D.D2 END,
            t.ND3 = CASE WHEN D.D3 = '' THEN NULL ELSE D.D3 END,
            t.NRD = CASE WHEN D.RandomDim = '' THEN NULL ELSE D.RandomDim END,
            t.Quantity = D.PurchaseQty
        FROM
            #temp_po t INNER JOIN @detail D ON D.IndentDetailID = t.OIndentDetailID
        WHERE
            t.IndentID = @IndentID

しかし、それはエラーを与えます

等しい操作で「Latin1_General_CI_AI」と「SQL_Latin1_General_CP1_CI_AS」の間の照合の競合を解決できません。

この問題を解決するには?

私のtempdb照合はLatin1_General_CI_AIと実際のデータベース照合はSQL_Latin1_General_CP1_CI_AS

20
thevan

これは、#tempdb.temp_po.OD1STR_IndentDetail.D1の照合順序が異なるために発生します。

一時テーブルの作成を制御できるため、これを解決する最も簡単な方法は、STR_IndentDetailテーブルと同じ照合で一時テーブルに* char列を作成することです。

CREATE TABLE #temp_po(
    IndentID INT, 
    OIndentDetailID INT, 
    OD1 VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS, 
    .. Same for the other *char columns   

テーブルの作成を制御できない状況で、列を結合するとき、別の方法は、エラーが発生するDMLにCOLLATE SQL_Latin1_General_CP1_CI_ASまたはより簡単な明示的なCOLLATEステートメントを追加することです。 COLLATE DATABASE_DEFAULTを使用

SELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s 
   ON t.OD1 = s.D1 COLLATE SQL_Latin1_General_CP1_CI_AS;

または、簡単に

SELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s 
   ON t.OD1 = s.D1 COLLATE DATABASE_DEFAULT;

ここでSqlFiddle

35
StuartLC

サーバーの照合順序を変更することは簡単な決定ではなく、サーバー上に影響を受ける可能性のある他のデータベースがある場合があります。データベース照合を変更しても、既存のデータベースに常に推奨されるとは限りません。 COLLATE DATABASE_DEFAULT一時テーブルを作成するときは、SQLで照合をハードコーディングしないため、最も安全で簡単なオプションです。例えば:

CREATE TABLE #temp_table1
(
    column_1    VARCHAR(2)  COLLATE database_default
)
3
Maneesh Singh

デフォルトでは、一時テーブルはサーバーの照合を取ります。そのため、一時テーブルを使用してすべてのストアドプロシージャを更新すると、サーバーの照合のみが変更されます。

サーバー照合の設定または変更 についてこのリンクを確認してください

これは私のために働いた。

0
Munavvar

今、同じ問題に遭遇しました。一時テーブルの作成(または各一時テーブルの結合)に照合順序を追加する代わりに、一時テーブルの作成をテーブル変数宣言に変更しました。

0
IngoB