【问题标题】:SQL Server 2000 DTS - Cannot resolve collation conflict for equal to operationSQL Server 2000 DTS - 无法解决等于操作的排序规则冲突
【发布时间】:2010-12-03 22:08:02
【问题描述】:

我有一个 SQL Server 2000 DTS 包。

这个包的一个步骤有如下SQL:

SELECT *
FROM [Crocus_Limited$OrderRequestDetail]
WHERE (rep_updated > GETDATE() -2) 
AND NOT EXISTS

(SELECT OrderID 
FROM NavisionUpgrade.navision4.dbo.[WEBOrderDetails] rd 
WHERE rd.OrderID =     [Crocus_Limited$OrderRequestDetail].OrderID 
AND rd.NavisionItemNo = [Crocus_Limited$OrderRequestDetail].NavisionItemNo )

它失败了 - 给我错误: 无法解决等于操作的排序规则冲突。

这个 DTS 基本上将数据从一个数据库移动到另一个数据库(位于不同的地理位置)

我怎样才能改变上面的查询来解决这个问题?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2000 dts


    【解决方案1】:

    您的一个或两个连接列具有一个 char 数据类型(char、nchar、varchar、nvarchar),这些数据类型存储在每个数据库的不兼容排序规则中。

    您可以指定在任何字符串比较中使用的排序规则。最简单的方法是指定运行查询的机器的默认排序规则(我猜NavisionItemNo 是问题列):

    ...AND rd.NavisionItemNo collate database_default = [Crocus_Limited$OrderRequestDetail].NavisionItemNo collate database_default )
    

    编辑

    OrderID 也是一个 varchar 列吗?如果是这样,请尝试

    ...WHERE rd.OrderID collate database_default = [Crocus_Limited$OrderRequestDetail].OrderID collate database_default
    AND rd.NavisionItemNo collate database_default = [Crocus_Limited$OrderRequestDetail].NavisionItemNo ) collate database_default
    

    【讨论】:

    • 我将语句更改为: select * from [Crocus_Limited$OrderRequestDetail] WHERE (rep_updated > GETDATE() -2) and NOT EXISTS (Select OrderID FROM NavisionUpgrade.navision4.dbo.[WEBOrderDetails] rd where rd.OrderID = [Crocus_Limited$OrderRequestDetail].OrderID AND rd.NavisionItemNo collat​​e database_default = [Crocus_Limited$OrderRequestDetail].NavisionItemNo collat​​e database_default )并且仍然遇到相同的错误......
    【解决方案2】:

    正如前两篇文章提到的,您必须对每个非数字列使用 collat​​e 属性,但请查看目标数据库的排序规则并使用此排序规则(例如 SQL_Latin_CI_AS)。请注意,一个表可以有自己的排序规则,即使一列也可以有另一个排序规则,因此请深入了解您的定义。

    和平与好运 冰

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 2018-10-20
      • 2010-12-09
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多