一時テーブルを更新できません。これは私のクエリです
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
。
これは、#tempdb.temp_po.OD1
とSTR_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;
サーバーの照合順序を変更することは簡単な決定ではなく、サーバー上に影響を受ける可能性のある他のデータベースがある場合があります。データベース照合を変更しても、既存のデータベースに常に推奨されるとは限りません。 COLLATE DATABASE_DEFAULT
一時テーブルを作成するときは、SQLで照合をハードコーディングしないため、最も安全で簡単なオプションです。例えば:
CREATE TABLE #temp_table1
(
column_1 VARCHAR(2) COLLATE database_default
)
デフォルトでは、一時テーブルはサーバーの照合を取ります。そのため、一時テーブルを使用してすべてのストアドプロシージャを更新すると、サーバーの照合のみが変更されます。
サーバー照合の設定または変更 についてこのリンクを確認してください
これは私のために働いた。
今、同じ問題に遭遇しました。一時テーブルの作成(または各一時テーブルの結合)に照合順序を追加する代わりに、一時テーブルの作成をテーブル変数宣言に変更しました。