gpt4 book ai didi

SQL 排序规则与来自 Delphi 应用程序的临时表和过程参数冲突

转载 作者:行者123 更新时间:2023-12-03 15:58:30 27 4
gpt4 key购买 nike

我使用 MS SQL 已有几年了,在之前的工作中我从未遇到过类似的情况。但在我现在工作的地方,我遇到了一个错误,我真的很想知道其原因。

我制作了一个存储过程,并在我的 Delphi 5(是的,我知道)应用程序中使用一些参数调用它。这在两个数据库(来自不同时间的副本)上运行良好。但现在我在另一个数据库(又是一个副本)上尝试了它,但它给了我以下错误:

Cannot resolve the collation conflict between "Latin1_General_CI_AS" and 
"SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

我通过创建临时表然后尝试插入一些数据来得到这个。我什至不加入。有趣的是:当我删除整个 WHERE 子句时,它就起作用了。当我离开它时(尽管它只将参数与一张表进行比较),它失败了。

create table #TOP (EDAID int, ParentID char(30), ChildID char(30),
Position int, OrgQty_modified_manually bit)

这失败了:

insert into #TOP
select EDAID, ParentID, ChildID, Position, OrgQty_modified_manually
from EDA_SOBOM
where OrderNr = @OrderNr
and Position = @Position
and LN = @LN
and DL = @DL
and rtrim(ChildID) = @CurrentPart
and rtrim(ParentID) = @ParentID

这有效:

insert into #TOP
select EDAID, ParentID, ChildID, Position, OrgQty_modified_manually
from EDA_SOBOM

过程参数声明如下: @PartID char(30)、@Position int、@OrderNr char(8)、 @LN char(2)、@DL char(2)、@ParentID char(30)、@Modified 位输出

我在这里找到了解决方案:Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation .

所以我在 CREATE 之后添加了这个:

ALTER TABLE #TOP
ALTER COLUMN ParentID
VARCHAR(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL

ALTER TABLE #TOP
ALTER COLUMN ChildID
VARCHAR(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL

这使得整个事情再次工作...但我不明白为什么只有参数比较的 WHERE 子句失败...参数也可以有排序规则吗?

数据库具有 SQL_Latin1_General_CP1_CI_AS 排序规则。表 EDA_SOBOM 的 char 列上还具有排序规则 SQL_Latin1_General_CP1_CI_AS。我通过以下查询找到了这个:

SELECT col.name, col.collation_name
FROM sys.columns col
WHERE object_id = OBJECT_ID('EDA_SOBOM')

除了数据库级别和列级别之外,还有其他地方可以设置排序规则吗?

我想知道发生了什么事......

最佳答案

任何比较不同排序规则的字符串(即选择中的等于)的运算符都会出现排序规则冲突。

TempDb 采用服务器默认排序规则,而您的真实数据库可能有不同的排序规则,导致使用 DDL 创建的任何临时表都具有排序规则差异。

您可以在相等运算符之后添加“整理数据库默认值”子句,这应该可以修复它。或者您可以使用以下方法创建临时表:

select top 0 EDAID, ParentID, ChildID, Position, OrgQty_modified_manually 
into #top
from EDA_SOBOM

这将强制临时表列从数据库中获取数据类型(和排序规则)。

关于SQL 排序规则与来自 Delphi 应用程序的临时表和过程参数冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10546931/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com