1

私は任意の言語でデータを保存することになっているデータベースを持っています。どのロケールであるかを示す列があるため、データベースの照合に頼ることができず、クエリで実行時に照合を指定する必要があります。

EFEFを使用すると実行時に照合を指定できないことがわかっているため、データアクセスに使用したいという問題もあります。Linq照合を引数として取り、その関数をすべてのクエリに適用するSQL関数を作成することを考えています。

しかし、これは失敗します

CREATE FUNCTION fn_Compare
(   
    @TextValue nvarchar(max),
    @Culture varchar(10)
)
RETURNS  nvarchar(max)
AS
BEGIN
    RETURN @TextValue COLLATE @Culture
END
GO

これができるかどうか誰にもわかりますか?

4

1 に答える 1

2

これはできません。関数によって返される照合は、すべての戻り値で一貫している必要があります。たとえば、次の場合はエラーが発生します。

create function testfn (@test varchar(100), @i int)
returns varchar(100)
as
begin
    return(case when @i = 0 then @test collate SQL_Latin1_General_CP1_CS_AS
              else @test collate SQL_Latin1_General_CP1_CI_AS
         end)
end;

このエラーは、照合の競合が原因です。

あなたができることは使用することです:

alter database collate <whatever>

または、代わりに、必要な照合順序で新しい作業データベースを作成します。

于 2012-08-27T18:49:15.747 に答える