无法解决排序规则冲突。

4

我遇到了以下错误信息。

无法解决“Latin1_General_CI_AI”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突,这是在等于操作中出现的问题。

只有当我将以下代码放在WHERE子句中时才会出现该错误。

WHERE Region IN (SELECT Token FROM dbo.getParmsFromString(@Region))

现在,@Region 包含来自 SSRS 的多选字段中的所有值。
以下是使用的函数代码。
CREATE FUNCTION [dbo].[getParmsFromString]
    (@String VARCHAR(MAX))
RETURNS @Parms TABLE
(
    Token VARCHAR(MAX)
)
AS
BEGIN
    IF CHARINDEX(',', @String) != 0
    BEGIN
        ;WITH cte0(Token, List) AS
              (
                SELECT   SUBSTRING(@String, 1, CHARINDEX(',',@String,1) - 1)
                        ,SUBSTRING(@String,CHARINDEX(',',@String,1) + 1, LEN(@String)) + ','

                UNION ALL

                SELECT     SUBSTRING(List,1,ISNULL(CHARINDEX(',',List,1) - 1,1))
                        ,SUBSTRING(List,CHARINDEX(',',List,1) + 1, LEN(List))
                FROM cte0
                WHERE LEN(cte0.List) > 0
              )

            INSERT INTO @Parms (Token)
            SELECT Token
            FROM cte0
            OPTION (MAXRECURSION 0)
        RETURN;
    END

    ELSE
        INSERT INTO @Parms
            SELECT @String
        RETURN;
END
2个回答

2

尝试更改

 RETURNS @Parms TABLE 
( 
    Token VARCHAR(MAX) 
) 

使用

try changing RETURNS @Parms TABLE 
( 
    Token VARCHAR(MAX) COLLATE DATABASE_DEFAULT
)  

并且

WHERE Region IN (SELECT Token FROM dbo.getParmsFromString(@Region))   

使用

WHERE Region COLLATE DATABASE_DEFAULT  IN (SELECT Token FROM dbo.getParmsFromString(@Region))  

0
通常这种类型的错误发生在您尝试比较不同区域的数据或使用特定加密与使用不同加密的其他数据进行比较时。最可能的原因是他们的tempdb使用排序规则"SQL_Latin1_General_CP1_CI_AS",而数据库使用"Latin1_General_CI_AS"。结果,临时对象在排序规则"SQL_Latin1_General_CP1_CI_AS"下创建,然后无法与使用排序规则"Latin1_General_CI_AS"的数据库对象进行比较。
最简单的解决方法也是推荐的方法是在安装了排序规则"Latin1_General_CI_AS"的服务器上运行数据库。
顺便说一下,SQL排序规则("SQL_Latin1_General_CP1_CI_AS")是为了向后兼容而存在于SQL Server中。当处理国际数据或使用Unicode和非Unicode数据的数据库时,建议使用Windows排序规则("Latin1_General_CI_AS")。
您可以通过以下方式更改数据库排序规则:
use master
ALTER DATABASE "Your database"
COLLATE Latin1_General_CI_AS;

SELECT name, collation_name
FROM sys.databases;

如果需要的话,您还可以更改“master”数据库的排序规则,即重建数据库。请参阅以下链接:

http://msdn.microsoft.com/en-us/library/dd207003(v=sql.100).aspx

http://sqlbuzz.wordpress.com/2011/08/20/how-to-rebuild-master-database-aka-rebuilding-sql-server-2008r2/

但在执行此操作之前,请确保备份所有数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接