如何基于 T-SQL 中的函数使用 COLLATE? [复制]

Posted

技术标签:

【中文标题】如何基于 T-SQL 中的函数使用 COLLATE? [复制]【英文标题】:How do I use COLLATE based on a function in T-SQL? [duplicate] 【发布时间】: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 关键字暗示用于比较(以及索引)的排序规则 【参考方案1】:

您应该将排序规则添加到order by。 Collat​​ion 是类型定义,不能通过 set 操作来改变它。

SELECT Title FROM Things
ORDER BY Title COLLATE Finnish_Swedish_100_CI_AS

【讨论】:

以上是关于如何基于 T-SQL 中的函数使用 COLLATE? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 T-SQL 中的 LAG 函数是不确定的?

子选择 T-SQL 中的聚合函数

用户定义函数 T-SQL 中的大小写敏感性

T-SQL 中多个字段中的相同窗口函数:优化?

t-sql 用户定义函数,用表中的查找替换文本

T-SQL 2008 中的 REPLACE 函数与 T-SQL 2005 不同