Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
临时表排序规则冲突-错误:无法解决Latin1*和SQL_Latin1之间的排序规则冲突*_Sql_Sql Server_Collation_Tempdb - Fatal编程技术网

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

临时表排序规则冲突-错误:无法解决Latin1*和SQL_Latin1之间的排序规则冲突*,sql,sql-server,collation,tempdb,Sql,Sql Server,Collation,Tempdb,我无法更新临时表。这是我的问题 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), Qu

我无法更新临时表。这是我的问题

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\u General\u CI\u AI
,而我的实际数据库排序规则是
SQL\u Latin1\u General\u CP1\u CI\u AS

发生这种情况是因为
tempdb.temp\u po.OD1
STR\u detail.D1
排序规则不同(具体地说,请注意,
#tempdb
是一个不同的系统数据库,这就是为什么它会有一个默认的排序意见,而您自己的数据库和表可能提供了更具体的意见)

由于您可以控制临时表的创建,解决此问题的最简单方法似乎是在临时表中创建*char列,其排序规则与
STR\u 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   
在无法控制表创建的情况下,当您加入列时,另一种方法是在出现错误的DML中添加显式的
COLLATE
语句,可以通过
COLLATE SQL\u Latin1\u General\u CP1\u CI\u AS
或更简单的方式,使用
COLLATE DATABASE\u 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;

默认情况下,临时表采用服务器的排序规则。因此,使用临时表更新所有存储过程时,只更改服务器排序规则

请检查此链接以了解详细信息


这对我来说很有效。

我们现在遇到了同样的问题。不是将排序规则添加到临时表创建中(或每个临时表联接中),我们刚刚将临时表创建更改为表变量声明。

更改服务器排序规则不是一个直接的决定,服务器上可能有其他数据库可能会受到影响。即使更改数据库排序规则,对于现有填充的数据库也不总是可取的。我认为使用
COLLATE database\u DEFAULT
创建临时表时是最安全、最简单的选项,因为它不会硬编码sql中的任何排序规则。例如:

CREATE TABLE #temp_table1
(
    column_1    VARCHAR(2)  COLLATE database_default
)

正如@StuartLC在下面所说的,这是您的列排序规则(可能是从数据库继承的)和master之间的冲突,因为tempdb默认为master db的排序规则。最简单的解决方案是将COLLATE database_DEFAULT附加到每个(n)字符/(n)上varchar数据类型,因此创建的临时表始终与您正在使用的数据库相匹配