Temp Table排序规则冲突 – 错误:无法解决Latin1 *和SQL_Latin1 *之间的排序规则冲突*

前端之家收集整理的这篇文章主要介绍了Temp Table排序规则冲突 – 错误:无法解决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

但它给出错误

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;

SqlFiddle here

猜你在找的MsSQL相关文章