几年来我一直在使用 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 bit输出
所以我在 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 子句会失败......参数也可以有排序规则吗?
DB 有排序规则 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')
除了数据库级别和列级别之外,还有其他地方可以设置排序规则吗?
我想知道这是怎么回事...