由于排序规则不匹配导致对两个数据库的查询出错

时间:2018-01-10 11:06:44

标签: sql sql-server database collation

我是一名IT顾问,通常管理硬件和网络,但我们的程序员目前正在休假。我对在我们15个站点的练习管理软件服务器上的两个数据库上运行的MSSQL查询进行了一些修改,并且我在与整理相关的一些服务器上收到错误冲突。

在我们大多数网站的服务器上运行良好,但是出现了15台服务器中有4台服务器出于某种原因使用不同的排序规则。

我已经考虑过尝试更改整理,但它并没有顺利进行,所以我希望也许我可以调整查询,因此对于这些服务器而言,整理的差异并不重要。事实上,如果查询是“排序规则不可知”,那就更好了。这样我就可以在所有服务器上使用相同的查询而无需关心整理......可以这样做吗?

确切的错误是

  

Msg 446,Level 16,State 11,Line 1   无法解决" Latin1_General_CI_AS"之间的整理冲突和" SQL_Latin1_General_CP1_CI_AS"在CASE运算符中进行DISTINCT操作。

     

Msg 446,Level 16,State 11,Line 1   无法解决" Latin1_General_CI_AS"之间的整理冲突和" SQL_Latin1_General_CP1_CI_AS"在CASE运算符中进行DISTINCT操作。

我正在运行的查询是:

SELECT DISTINCT
-- setup columns
[cases].[reference] as MatterNumber,
[dd_entity_d2].[type] as ClientType,
[dd_client].[clientname] as MatterName,
CASE WHEN [dd_entity_d2].[type] ='Individual' THEN etClient.FirstName ELSE [dd_entity_d4].[firstname] END AS FirstName,
CASE WHEN [dd_entity_d2].[type] ='Individual' THEN etClient.LastName   ELSE [dd_entity_d4].[lastname] END AS LastName,
CASE WHEN [dd_entity_d2].[type] ='Individual' THEN [dd_entity_d2].[email]   ELSE [dd_entity_d4].[email] END AS Email,
etActing.[PreferredName] ActingPerson,
[cases].[category] as MatterType,
mt.CreatedOn as MatterOpened,
case mt.[Status]
    when 0 then 'In Progress'
    When 1 then 'On Hold'
    when 2 then 'Completed'
    when 3 then 'Not Proceeding'
else 'Unknown' end as MatterStatus
-- mt.LastUpdatedOn as LastModified,
-- end columns
-- setup data
FROM PracticeEvolve_doc.dbo.[cases]
INNER JOIN PracticeEvolve_c1.dbo.DocumaticsMap dm on dm.DocumaticsID = [cases].ID and dm.Entitytype = 'Matter'
INNER JOIN PracticeEvolve_c1.dbo.[Matter] mt on mt.Matterid = dm.ClickOneID
INNER JOIN PracticeEvolve_c1.dbo.[Client] cl on mt.ClientID = cl.ClientID
INNER JOIN PracticeEvolve_c1.dbo.[Entity] etClient on cl.EntityID = etClient.EntityID
LEFT JOIN PracticeEvolve_c1.dbo.EmployeeMatter emActing on emActing.MatterID = mt.MatterID and emActing.AssociationTypeID = 15
LEFT JOIN PracticeEvolve_c1.dbo.Employee eActing on eActing.EmployeeID = emActing.EmployeeID
LEFT JOIN PracticeEvolve_c1.dbo.Entity etActing on etActing.EntityID = eActing.EntityID
LEFT JOIN PracticeEvolve_doc.dbo.[dd_client] ON [dd_client].[id]=[cases].[clientid]
LEFT JOIN PracticeEvolve_doc.dbo.[dd_manytomany] AS [dd_manytomanydd_entity_d2] ON [dd_manytomanydd_entity_d2].[fkid] = [dd_client].[fk_entities]
LEFT JOIN PracticeEvolve_doc.dbo.[dd_entity] as [dd_entity_d2] ON [dd_entity_d2].[id] = [dd_manytomanydd_entity_d2].[pkid]
LEFT JOIN PracticeEvolve_doc.dbo.[dd_manytomany] AS [dd_manytomanydd_party_d3] ON [dd_manytomanydd_party_d3].[fkid] = [dd_entity_d2].[fk_parties]
LEFT JOIN PracticeEvolve_doc.dbo.[dd_party] as [dd_party_d3] ON [dd_party_d3].[id] = [dd_manytomanydd_party_d3].[pkid]
LEFT JOIN PracticeEvolve_doc.dbo.[dd_manytomany] AS [dd_manytomanydd_entity_d4] ON [dd_manytomanydd_entity_d4].[fkid] = [dd_party_d3].[fk_entity]
LEFT JOIN PracticeEvolve_doc.dbo.[dd_entity] as [dd_entity_d4] ON [dd_entity_d4].[id] = [dd_manytomanydd_entity_d4].[pkid]
-- end data
-- setup filters
WHERE [cases].[deleted]=0   
    -- AND DATEPART(m, mt.CreatedOn) = DATEPART(m, DATEADD(m, -1, getdate()))
    -- AND DATEPART(yyyy, mt.CreatedOn) = DATEPART(yyyy, DATEADD(m, -1, getdate())) 
    AND mt.CreatedOn >= '2015-07-01'   
    -- AND [dd_entity_d2].[type] = 'Individual'
    -- AND mt.LastUpdatedOn >= '2017-04-02'   
    -- AND mt.[status] = 0
-- end filters 
-- setup sort
ORDER BY Email ASC
-- end sort and query

PracticeEvolve_c1是 SQL_Latin1_General_CP1_CI_AS ,而PracticeEvolve_doc是 Latin1_General_CI_AS

我不在这里,非常感谢您提供的任何帮助。

干杯 - Reece

编辑: FWIW - 这是我在尝试更改数据库排序规则时遇到的错误:

  

对象' MonthToDays365'依赖于数据库整理。如果架构绑定对象依赖于它,则无法更改数据库排序规则。删除数据库排序规则的依赖关系,然后重试该操作

1 个答案:

答案 0 :(得分:3)

只需修改CASE表达式并包含COLLATE命令

即可
CASE WHEN [dd_entity_d2].[type] COLLATE SQL_Latin1_General_CP1_CI_AS 
          ='Individual' 
THEN etClient.FirstName COLLATE SQL_Latin1_General_CP1_CI_AS 
ELSE [dd_entity_d4].[firstname] COLLATE SQL_Latin1_General_CP1_CI_AS 
END AS FirstName,