2014-01-24 56 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 
) 
相关问题