加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:47:12 所属栏目:MsSql教程 来源:网络整理
导读:我无法更新临时表.这是我的查询 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),Quantit
我无法更新临时表.这是我的查询
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读