无法解决排序规则冲突

时间:2012-09-28 11:29:13

标签: sql-server-2008 tsql function reporting-services

我收到以下错误消息。

  

无法在等于操作的情况下解决“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

3 个答案:

答案 0 :(得分: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))  

答案 1 :(得分:0)

你一定要看看这个链接:

http://msdn.microsoft.com/de-de/library/ms179886.aspx

还有一个示例如何更改查询中的排序规则。

答案 2 :(得分:0)

通常,当您尝试比较不同区域的数据或使用特定加密将数据与使用不同加密的其他数据进行比较时,会发生此类错误。 最可能的原因是,当数据库使用“Latin1_General_CI_AS”时,他们的tempdb正在使用排序规则“SQL_Latin1_General_CP1_CI_AS”。因此,临时对象在归类“SQL_Latin1_General_CP1_CI_AS”下创建,然后无法与使用归类“Latin1_General_CI_AS”的数据库的数据库对象进行比较。

最简单的修复以及推荐的修复是在使用归类“Latin1_General_CI_AS”安装的服务器上运行数据库。

FYI。 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;

如果需要,您还可以更改“主”数据库的整理,即重建数据库,为此,请访问以下链接:

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/

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