我有下面的代码

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的副本。


当前回答

我以前有过类似的东西,我们发现两个表之间的排序是不同的。

检查它们是否相同。

其他回答

当您有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

您的表中有两个不同的排序规则不匹配。你可以通过使用这个查询来检查你的表中每一列的排序规则:

SELECT
    col.name, col.collation_name
FROM 
    sys.columns col
WHERE
    object_id = OBJECT_ID('YourTableName')

在排序和比较字符串时需要并使用排序规则。在整个数据库中使用单一的、唯一的排序规则通常是个好主意——不要在单个表或数据库中使用不同的排序规则——你只会自找麻烦....

一旦你确定了一个排序规则,你可以使用下面的命令改变那些不匹配的表/列:

ALTER TABLE YourTableName
  ALTER COLUMN OffendingColumn
    VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL

Marc

更新:在你的数据库中找到全文索引,使用这个查询:

SELECT
    fti.object_Id,
    OBJECT_NAME(fti.object_id) 'Fulltext index',
    fti.is_enabled,
    i.name 'Index name',
    OBJECT_NAME(i.object_id) 'Table name'
FROM 
    sys.fulltext_indexes fti
INNER JOIN 
    sys.indexes i ON fti.unique_index_id = i.index_id

然后你可以删除全文索引使用:

DROP FULLTEXT INDEX ON (tablename)

如果这种情况发生在整个数据库中,那么最好像这样改变你的数据库排序规则:

USE master;  
GO  
ALTER DATABASE MyOptionsTest  
COLLATE << INSERT COLATION REQUIRED >> ;  
GO  

--Verify the collation setting.  
SELECT name, collation_name  
FROM sys.databases  
WHERE name = N'<< INSERT DATABASE NAME >>';  
GO 

参考这里

检查不匹配的排序规则级别(服务器、数据库、表、列、字符)。

如果是服务器,这些步骤曾经帮助过我:

停止服务器 找到sqlservr.exe工具 执行如下命令: sqlservr -m -T4022 -T3659 -s" name_of_instance " q“name_of_collation” 启动sql server: Net启动name_of_instance 再次检查服务器的排序规则。

以下是更多信息:

https://www.mssqltips.com/sqlservertip/3519/changing-sql-server-collation-after-installation/

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

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

从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