2014-01-24 67 views
15

我無法更新臨時表。這是我的查詢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 

但它給錯誤

無法解析「Latin1_General_CI_AI」,並在相同的操作規則「SQL_Latin1_General_CP1_CI_AS」之間的排序規則衝突。

如何解決此問題?

我的tempdb整理是Latin1_General_CI_AI和我的實際數據庫整理是SQL_Latin1_General_CP1_CI_AS

+2

作爲@StuartLC下面說,這是你的列排序規則(可能從數據庫繼承)和主之間的衝突,因爲tempdb的默認主數據庫的整理。最簡單的解決方案是將COLLATE DATABASE_DEFAULT附加到每個(n)char /(n)varchar數據類型,以便始終創建臨時表以匹配您正在使用的數據庫。 – Kahn

回答

25

發生這種情況是因爲#tempdb.temp_po.OD1STR_IndentDetail.D1上的排序規則有所不同。

既然你在創建臨時表的控制,來解決這個最簡單的方法似乎是創建*在臨時表中的字符列具有相同的排序規則爲您STR_IndentDetail表:

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; 

OR,更容易

SELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s 
    ON t.OD1 = s.D1 COLLATE DATABASE_DEFAULT; 

SqlFiddle here

+0

相關文章http://www.mssqltips.com/sqlservertip/2440/create-sql-server-temporary-tables-with-the-correct-collat​​ion/ –

0

默認情況下,臨時表採取服務器的排序規則。因此,使用臨時表更新所有存儲過程只會更改服務器排序規則。

檢查此鏈接爲Set or Change the Server Collation

這爲我工作。

0

我們現在遇到了同樣的問題。我們只是將臨時表創建更改爲表變量聲明,而不是將臨時表添加到臨時表創建(或每個臨時表聯接)中。

1

更改服務器排序規則不是一個直截了當的決定,服務器上可能會有其他數據庫可能會受到影響。即使更改數據庫歸類對於現有的已填充數據庫並不總是可取的。我認爲在創建臨時表時使用COLLATE DATABASE_DEFAULT是最安全和最簡單的選項,因爲它不會在SQL中對任何排序規則進行硬編碼。例如:

CREATE TABLE #temp_table1 
(
    column_1 VARCHAR(2) COLLATE database_default 
) 
相關問題