|
我不能更新临时表。这是我的查询
1 ?+ L" R. E/ P# R0 Z- y$ `& m8 yCREATE 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但它犯了错误) }2 F, T% c* _8 x) `" e; m3 X
等于操作解决不了 Latin1_General_CI_AI”和“ SQL_Latin1_General_CP1_CI_AS排序规则冲突。
) s( ^) n0 B$ F: o V如何解决这个问题?
+ u7 I: n! n+ B5 b我的tempdb排序规则是,Latin1_General_CI_AI而我实际的数据库排序规则是SQL_Latin1_General_CP1_CI_AS。" S# E2 G: }7 |* M- @
0 Q! T- U0 `* E
解决方案: 0 E6 Y: U7 ^5 a4 u% E# C( K6 \
这是因为排序规则正在发生#tempdb.temp_po.OD1和上STR_IndentDetail.D一是不同的(特别的#tempdb请注意,这是一个不同的系统数据库。通常,这就是为什么它对排名规则有默认意见,这与您自己的数据库和表格不同(可能提供更具体的意见)
8 a$ x2 } H( U4 O5 `。4 I- k! l L0 k4 C, H& i, y
由于您可以控制临时表的创建,解决这个问题的最简单的方法似乎是使用与表相同的排序规则来创建临时表* char列STR_IndentDetail:1 o' G2 P N$ _- X/ J
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
* z+ n) i" ^% E: I+ l( @: `8 TSELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s ON t.OD1 = s.D1 COLLATE SQL_Latin1_General_CP1_CI_AS;或者,更容易) I$ X) q0 a- a }5 u: u
SELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s ON t.OD1 = s.D1 COLLATE DATABASE_DEFAULT;SqlFiddle在这里 |
|