【发布时间】:2018-05-15 06:19:36
【问题描述】:
我有以下函数用于根据@c 参数为@p 列设置COLLATE。我的灵感来自this answer。
CREATE FUNCTION [dbo].[fnsConvert]
(
@p NVARCHAR(2000),
@c NVARCHAR(2000)
)
RETURNS NVARCHAR(2000)
AS
BEGIN
IF ( @c = 'sv-SE' )
SET @p = @p COLLATE Finnish_Swedish_100_CI_AS
ELSE
SET @p = @p COLLATE SQL_Latin1_General_CP1_CI_AS
RETURN @p
END
我就是这样使用它的:
SELECT Title FROM Things
ORDER BY dbo.fnsConvert(Title, 'sv-SE')
结果:AÅÄBCÖ 预期:ABCÅÄÖ
为了调试它,我运行了
DECLARE @l nvarchar(255)
DECLARE @P nvarchar(255)
EXEC @l = dbo.fnsConvert
@p = Test, @c = 'sv-SE';
SELECT @l
这只是返回字符串Test。我希望它也包含 COLLATE 语句,但我很可能错了。
【问题讨论】:
-
我认为,您之前阅读的链接答案不正确...一个简单的变量不知道它的排序规则...
-
标量函数不能返回带有隐含排序规则的值。正如Shnugo所说,您链接上的答案是错误的。您必须使用动态 SQL 来执行此操作,因为排序规则无法参数化。
-
排序规则是比较模式,不是字符串变量的属性。
COLLATE关键字暗示用于比较(以及索引)的排序规则
标签: tsql user-defined-functions collate