我有一个应该以任何语言存储数据的数据库,会有一个列告诉我它是哪个语言环境,因此我不能依赖数据库排序规则,并且必须在运行时指定排序规则查询。
我还有一个问题,我想使用EF
进行数据访问,因为我们知道使用EF无法在运行时指定排序规则。我正在考虑创建一个将collation作为参数的sql函数,并在所有Linq
查询中应用该函数。
但是失败了
CREATE FUNCTION fn_Compare
(
@TextValue nvarchar(max),
@Culture varchar(10)
)
RETURNS nvarchar(max)
AS
BEGIN
RETURN @TextValue COLLATE @Culture
END
GO
有人知道是否可以这样做吗?
答案 0 :(得分:1)
你不能这样做。函数返回的排序规则需要在所有返回值中保持一致。例如,以下内容会生成错误:
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>
或者,或者,使用所需的排序规则创建一个新的工作数据库。