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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...