SQL Server子查询列排序规则不一致,如何改写查询?
解决SQL Server排序规则冲突的查询改写方案
出现该错误的原因是用于比较的两个列(a.itemID和b.ID)采用了不同的排序规则,SQL Server无法自动完成匹配比较。以下是几种可行的查询改写方式:
方法1:在子查询列上指定匹配主查询的排序规则
SELECT a.itemID, a.ItemName FROM [SRVR1].[DB1].[dbo].[ItemsOnStock] a WHERE a.itemID NOT IN (SELECT b.ID COLLATE SQL_Latin1_General_CP850_CI_AS FROM [SRVR2].[DB10].[dbo].[InTransItems] b)
方法2:将主查询列转换为子查询列的排序规则
SELECT a.itemID, a.ItemName FROM [SRVR1].[DB1].[dbo].[ItemsOnStock] a WHERE a.itemID COLLATE Latin1_General_CI_AS NOT IN (SELECT b.ID FROM [SRVR2].[DB10].[dbo].[InTransItems] b)
方法3:改用NOT EXISTS语法(性能更稳定)
SELECT a.itemID, a.ItemName FROM [SRVR1].[DB1].[dbo].[ItemsOnStock] a WHERE NOT EXISTS ( SELECT 1 FROM [SRVR2].[DB10].[dbo].[InTransItems] b WHERE a.itemID COLLATE Latin1_General_CI_AS = b.ID )
补充说明
选择哪种排序规则取决于业务需求,需确保字符比较逻辑符合预期。如果要长期解决该冲突,也可以考虑修改其中一列的排序规则使其与另一列一致,但需注意修改表结构带来的影响。
内容的提问来源于stack exchange,提问作者Jaime Dolor jr.
相关产品推荐
相关产品推荐

