我有下面的代码

SELECT tA.FieldName As [Field Name],
       COALESCE(tO_A.[desc], tO_B.[desc], tO_C.Name, tA.OldVAlue) AS [Old Value],
       COALESCE(tN_A.[desc], tN_B.[desc], tN_C.Name, tA.NewValue) AS [New Value],
       U.UserName AS [User Name],
       CONVERT(varchar, tA.ChangeDate) AS [Change Date] 
  FROM D tA
       JOIN 
       [DRTS].[dbo].[User] U 
         ON tA.UserID = U.UserID
       LEFT JOIN 
       A tO_A 
         on tA.FieldName = 'AID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_A.ID)
       LEFT JOIN 
       A tN_A 
         on tA.FieldName = 'AID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_A.ID)
       LEFT JOIN 
       B tO_B 
         on tA.FieldName = 'BID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_B.ID)
       LEFT JOIN 
       B tN_B 
         on tA.FieldName = 'BID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_B.ID)
       LEFT JOIN 
       C tO_C 
         on tA.FieldName = 'CID' 
        AND tA.oldValue = tO_C.Name
       LEFT JOIN 
       C tN_C 
         on tA.FieldName = 'CID' 
        AND tA.newValue = tN_C.Name
 WHERE U.Fullname = @SearchTerm
ORDER BY tA.ChangeDate

当运行代码时,我在添加表c的两个连接后,将错误粘贴在标题中。我认为这可能与我使用SQL Server 2008的事实有关,并在2005年的机器上恢复了这个db的副本。


当前回答

确定抛出此错误的字段,并向它们添加以下内容: 核对DATABASE_DEFAULT

Code字段中有两个表连接:

...
and table1.Code = table2.Code
...

将查询更新为:

...
and table1.Code COLLATE DATABASE_DEFAULT = table2.Code COLLATE DATABASE_DEFAULT
...

其他回答

您的数据库中可能没有任何排序规则问题,但是如果您从服务器上的备份恢复了数据库的副本,其排序规则与原始数据库不同,并且您的代码正在创建临时表,那么这些临时表将从服务器继承排序规则,并将与您的数据库发生冲突。

INSERT INTO eSSLSmartOfficeSource2.[dbo].DeviceLogs  (DeviceId,UserId,LogDate,UpdateFlag) 
SELECT DL1.DeviceId ,DL1.UserId COLLATE DATABASE_DEFAULT,DL1.LogDate 
,0 FROM eSSLSmartOffice.[dbo].DeviceLogs DL1 
WHERE  NOT EXISTS 
(SELECT DL2.DeviceId ,DL2.UserId COLLATE DATABASE_DEFAULT
,DL2.LogDate ,DL2.UpdateFlag 
FROM eSSLSmartOfficeSource2.[dbo].DeviceLogs DL2    
WHERE  DL1.DeviceId =DL2.DeviceId
 and DL1.UserId collate  Latin1_General_CS_AS=DL2.UserId collate  Latin1_General_CS_AS
  and DL1.LogDate =DL2.LogDate )

下面是我们所做的,在我们的情况下,我们需要一个临时查询,使用日期限制按需执行,查询定义在一个表中。

我们的新查询需要匹配不同数据库之间的数据,并包括来自这两个数据库的数据。

从iSeries/AS400系统导入数据的db和我们的报告数据库之间的COLLATION似乎是不同的——这可能是因为特定的数据类型(例如名称上的希腊重音等等)。

所以我们使用了下面的join子句:

...LEFT Outer join ImportDB..C4CTP C4 on C4.C4CTP COLLATE Latin1_General_CS_AS=CUS_Type COLLATE Latin1_General_CS_AS

当您有2个不同的数据库,特别是来自2个不同服务器的2个不同数据库时,很容易发生这种情况。最好的选择是将其更改为公共集合并进行连接或比较。

SELECT 
   *
FROM sd
INNER JOIN pd ON sd.SCaseflowID COLLATE Latin1_General_CS_AS = pd.PDebt_code COLLATE Latin1_General_CS_AS

到目前为止,我几乎阅读了这里的每一个答案和评论。它让我得到了一个简单的解决方案,通过结合所做的反应。下面是我解决问题的简单方法:

创建数据库脚本。右键单击数据库> Tasks >生成脚本。一定要包括模式和数据 保存脚本后删除数据库。右键单击数据库>删除 删除脚本中重建数据库的部分,即删除第一行之前的所有内容:

< DATABASENAME >

GO

创建数据库'手动',即右键单击表>创建数据库… 运行为新空数据库设置默认排序规则的脚本。 使用主; 去 ALTER DATABASE << DatabaseName >> 核对<<插入排序要求>>; 去 运行您保存的脚本以重新创建数据库

信贷

@Justin提供了检查数据库排序的脚本,以及如何更新它 @RockScience提到排序规则的改变只适用于新的表/对象 @Felix Mwiti Mugambi(感谢我的肯尼亚同胞:))指出需要重建数据库。(我通常避免删除和创建复杂的数据库)