我无法更新临时表。这是我的查询
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
但它给出了错误
无法在等于操作的情况下解决“Latin1_General_CI_AI”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突。
如何解决此问题?
我的tempdb
排序规则为Latin1_General_CI_AI
,我的实际数据库排序规则为SQL_Latin1_General_CP1_CI_AS
。
答案 0 :(得分:32)
这是因为#tempdb.temp_po.OD1
和STR_IndentDetail.D1
上的排序规则不同。
由于您可以控制临时表的创建,因此解决此问题的最简单方法似乎是在临时表中使用与STR_IndentDetail
表相同的排序规则创建* char列:
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中添加显式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;
答案 1 :(得分:2)
更改服务器排序规则不是一个直接的决定,服务器上可能有其他数据库可能会受到影响。即使更改数据库归类也不总是建议现有的填充数据库。我认为在创建临时表时使用COLLATE DATABASE_DEFAULT
是最安全和最简单的选项,因为它不会对您的SQL中的任何排序规则进行硬编码。例如:
CREATE TABLE #temp_table1
(
column_1 VARCHAR(2) COLLATE database_default
)
答案 2 :(得分:0)
答案 3 :(得分:0)
我们现在遇到了同样的问题。我们只是将临时表创建更改为表变量声明,而不是将排序规则添加到临时表创建(或每个临时表连接)。