如何基于 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
。 Collation 是类型定义,不能通过 set 操作来改变它。
SELECT Title FROM Things
ORDER BY Title COLLATE Finnish_Swedish_100_CI_AS
【讨论】:
以上是关于如何基于 T-SQL 中的函数使用 COLLATE? [复制]的主要内容,如果未能解决你的问题,请参考以下文章