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
4

2 回答 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))  
于 2012-09-28T11:46:47.220 回答
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;

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

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/

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

于 2012-09-28T21:56:01.973 回答