gpt4 book ai didi

SQL 服务器 : How to change collation of all columns of my select on the fly

转载 作者:行者123 更新时间:2023-12-05 04:03:11 27 4
gpt4 key购买 nike

我需要从我的数据库中的一个表中查询一些内容,但某些列的排序规则与我需要的不同。

我找到了如何像这样即时更改一列的排序规则:

SELECT 
u.name COLLATE Latin1_General_CI_AS AS 'User'(...)

但问题是超过 150 列需要即时更改 COLLATION(不要问我为什么,因为我们不能更改整个表的排序规则,尽管我认为这是最好的选择).

所以主要问题是:有没有办法将 COLLATION 设置为我查询的所有列?

最佳答案

无法即时更改所有文本列的排序规则——但操纵查询以获得相同结果是可行的。 Martin's answer显示了一种方法,这是使用查询元数据的另一种方法。作为一个好处,它是无游标的,并且如果排序规则已经是我们想要的,它可以避免无偿地引入"new"列。它至少需要 SQL Server 2012 有 sys.dm_exec_describe_first_result_set,SQL Server 2017 有 STRING_AGG(在以前的版本上,可以使用经典的字符串连接技巧,比如FOR XML PATH 技巧)。

DECLARE @query NVARCHAR(MAX) = N'SELECT * FROM MyTable';
DECLARE @tweakedQuery NVARCHAR(MAX);
DECLARE @tweakedCollation SYSNAME = N'Latin1_General_CI_AS';

SELECT @tweakedQuery = CONCAT(
'SELECT ',
STRING_AGG(
CONCAT(
CONVERT(NVARCHAR(MAX), QUOTENAME([name])),
CASE
WHEN collation_name IS NOT NULL AND collation_name <> @tweakedCollation
THEN ' COLLATE ' + @tweakedCollation + ' AS ' + QUOTENAME([name])
END
),
', ' + CHAR(13) + CHAR(10)
),
' FROM (' + CHAR(13) + CHAR(10),
@query,
CHAR(13) + CHAR(10) + ') _'
)
FROM sys.dm_exec_describe_first_result_set(@query, NULL, NULL);
PRINT @tweakedQuery;

如果自定义别名是系统生成的(基于表名或列名),则合并自定义别名会很简单。否则,您将不得不手动进行修补。

对于一次性查询(不一定需要即时执行),熟悉在您喜欢的编辑器中使用正则表达式仍然是一个更好的主意。如果您最喜欢的编辑器没有正则表达式,那就找一个有正则表达式的吧。

关于SQL 服务器 : How to change collation of all columns of my select on the fly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53723286/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com