SQL Server 2014 SELECT语句第3列排序规则冲突问题求助
解决SQL排序规则冲突问题
这个错误Cannot resolve collation conflict for column 3 in SELECT statement的核心原因是:你的CompanyName字段和Cust_LastName/Cust_FirstName字段使用了不同的排序规则。当CASE语句的两个分支返回不同排序规则的字符串时,SQL Server无法确定用哪种规则来处理最终结果,所以抛出了冲突错误。
你之前的测试也验证了这一点:单独拼接Cust_LastName和Cust_FirstName时没问题(因为这两个字段排序规则一致),只返回CompanyName也没问题,但把两者放在同一个CASE的不同分支里就触发了冲突。
解决方案:统一字符串排序规则
你只需要在CASE语句的结果上显式指定一个统一的排序规则,或者给每个分支的字符串都加上相同的排序规则即可。这里提供两种可行的写法:
写法1:给整个CASE结果指定排序规则
SELECT AccountNumber, AmountDue, -- 统一CustomerName的排序规则 CASE WHEN ISNULL(CompanyName, '') = '' THEN ISNULL(Cust_LastName, '') + ', ' + ISNULL(Cust_FirstName, '') ELSE CompanyName END COLLATE SQL_Latin1_General_CP1_CI_AS CustomerName, -- 同样处理Attn_To字段 CASE WHEN ISNULL(CompanyName, '') = '' THEN '' ELSE ISNULL(Cust_FirstName, '') + ' ' + ISNULL(Cust_LastName, '') END COLLATE SQL_Latin1_General_CP1_CI_AS Attn_To, [Address] FROM CustomerAccount
写法2:给每个分支的字符串单独指定排序规则
SELECT AccountNumber, AmountDue, CASE WHEN ISNULL(CompanyName, '') = '' THEN (ISNULL(Cust_LastName, '') + ', ' + ISNULL(Cust_FirstName, '')) COLLATE SQL_Latin1_General_CP1_CI_AS ELSE CompanyName COLLATE SQL_Latin1_General_CP1_CI_AS END CustomerName, CASE WHEN ISNULL(CompanyName, '') = '' THEN '' ELSE (ISNULL(Cust_FirstName, '') + ' ' + ISNULL(Cust_LastName, '')) COLLATE SQL_Latin1_General_CP1_CI_AS END Attn_To, [Address] FROM CustomerAccount
小提示:确认字段排序规则
如果你不确定该用哪种排序规则,可以先查询表中各个字段的排序规则:
SELECT COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'CustomerAccount'
然后选择其中一个字段的排序规则(比如数据库默认的排序规则)来统一即可。
内容的提问来源于stack exchange,提问作者user1777929
相关产品推荐
相关产品推荐

