回答

收藏

临时表排序规则冲突-错误:无法解决Latin1 *和SQL_Latin1 *排序规则冲突

技术问答 技术问答 578 人阅读 | 0 人回复 | 2023-09-14

我不能更新临时表。这是我的查询, r- y, R- S5 S
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但它犯了错误
3 t5 }! P% g4 Q8 t9 ~等于操作解决不了 Latin1_General_CI_AI”和“ SQL_Latin1_General_CP1_CI_AS排序规则冲突。7 c7 S# ]  E% d2 Q  U+ Y
如何解决这个问题?/ X& G5 {8 I& c* L# P3 X7 k
我的tempdb排序规则是,Latin1_General_CI_AI而我实际的数据库排序规则是SQL_Latin1_General_CP1_CI_AS。
1 a+ G3 L1 B$ e) A" q, g; w                                                                  u# r* ^0 L2 C
    解决方案:                                                                # F8 V0 t  U& r8 t
                                                                这是因为排序规则正在发生#tempdb.temp_po.OD1和上STR_IndentDetail.D一是不同的(特别的#tempdb请注意,这是一个不同的系统数据库。通常,这就是为什么它对排名规则有默认意见,这与您自己的数据库和表格不同(可能提供更具体的意见)
4 c( `3 A8 [# m6 W# r' b" A7 i( E6 d1 a  B1 P+ E$ a' c
由于您可以控制临时表的创建,解决这个问题的最简单的方法似乎是使用与表相同的排序规则来创建临时表* char列STR_IndentDetail:9 C# o' Q8 e/ {- }
CREATE TABLE #temp_po(    IndentID INT,    OIndentDetailID INT,    OD1 VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS,    .. Same for the other *char columns当无法控制表创建的情况下,当您连接每列时,另一种方法是COLLATE在DML在这里添加显式句子的错误方法是通过COLLATESQL_Latin1_General_CP1_CI_AS使用或更容易使用COLLATE DATABASE_DEFAULT
9 F: ^6 x& a( L9 u2 hSELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s    ON t.OD1 = s.D1 COLLATE SQL_Latin1_General_CP1_CI_AS;或者,更容易
' v+ F3 e% Q# y5 TSELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s    ON t.OD1 = s.D1 COLLATE DATABASE_DEFAULT;SqlFiddle在这里
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则