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

通常、このタイプのエラーは、異なるリージョンのデータを比較しようとした場合、または特定の暗号化を使用したデータを別の暗号化を使用した他のデータと比較した場合に発生します。最も可能性の高い理由は、データベースが「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」を使用してインストールされたサーバーでデータベースを実行することです。

ご参考までに。SQL照合("SQL_Latin1_General_CP1_CI_AS")は、下位互換性のためにSQLサーバーに存在します。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 に答える