我无法更新临时表.这是我的查询
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
但它给出错误
Cannot resolve the collation conflict between “Latin1_General_CI_AI” and “sql_Latin1_General_CP1_CI_AS” in the equal to operation.
如何解决这个问题?
我的tempdb归类是Latin1_General_CI_AI,我的实际数据库归类是sql_Latin1_General_CP1_CI_AS.
解决方法
这是因为#tempdb.temp_po.OD1和STR_IndentDetail.D1上的归类不同.
由于您可以控制临时表的创建,因此最简单的解决方法似乎是在临时表中创建* char列,其格式与STR_IndentDetail表相同:
CREATE TABLE #temp_po( IndentID INT,OD1 VARCHAR(50) COLLATE sql_Latin1_General_CP1_CI_AS,.. Same for the other *char columns
在您无法控制表创建的情况下,当您加入列时,另一种方法是在DML中添加明确的COLLATE语句,其中出现错误,通过COLLATE sql_Latin1_General_CP1_CI_AS或更容易,使用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;