我有下面的代码

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


当前回答

在where条件中添加collate SQL_Latin1_General_CP1_CI_AS

这对我很有用。

WHERE U.Fullname = @SearchTerm  collate SQL_Latin1_General_CP1_CI_AS

其他回答

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

Code字段中有两个表连接:

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

将查询更新为:

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

对于那些有一个CREATE DATABASE脚本(就像我的情况)的数据库,导致这个问题,你可以使用下面的CREATE脚本来匹配排序规则:

-- Create Case Sensitive Database
CREATE DATABASE CaseSensitiveDatabase
COLLATE SQL_Latin1_General_CP1_CS_AS -- or any collation you require
GO
USE CaseSensitiveDatabase
GO
SELECT *
FROM sys.types
GO
--rest of your script here

or

-- Create Case In-Sensitive Database
CREATE DATABASE CaseInSensitiveDatabase
COLLATE SQL_Latin1_General_CP1_CI_AS -- or any collation you require
GO
USE CaseInSensitiveDatabase
GO
SELECT *
FROM sys.types
GO
--rest of your script here

这将对所有表应用所需的排序规则,这正是我所需要的。理想的做法是,尽量保持服务器上所有数据库的排序规则相同。 希望这能有所帮助。

有关以下链接的更多信息:SQL SERVER -在服务器上创建具有不同排序规则的数据库

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

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

停止服务器 找到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/

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

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 

参考这里

你可以通过4个简单的步骤轻松做到这一点

备份你的数据库,以防万一 更改数据库排序规则:右键单击数据库,选择属性,转到选项并将排序规则更改为所需的排序规则。 生成一个脚本来删除和重新创建所有数据库对象:右键单击数据库,选择任务,选择生成脚本…(请确保在向导的高级选项中选择了删除和创建,并选择模式和数据) 运行上面生成的脚本