【发布时间】:2016-06-30 17:20:15
【问题描述】:
在我使用的 SqlServer 数据库中,数据库名称类似于 StackExchange.Audio.Meta、StackExchange.Audio 或 StackOverflow。幸运的是,这也是一个网站的 url。我只需要在点上拆分它并反转它:meta.audio.stackexchange。添加http:// 和.com 就完成了。显然Stackoverflow 不需要任何反转。
使用 SqlServer 2016 string_split 函数我可以轻松拆分和重新排序结果:
select value
from string_split(db_name(),'.')
order by row_number() over( order by (select 1)) desc
这给了我
| Value |
-----------------
| Meta |
| Audio |
| StackExchange |
由于我需要在变量中包含 url,我希望使用 answer 将其连接起来,所以我的尝试如下所示:
declare @revname nvarchar(150)
select @revname = coalesce(@revname +'.','') + value
from string_split(db_name(),'.')
order by row_number() over( order by (select 1)) desc
但是,这只会返回最后一个值,StackExchange。我已经注意到该答案中的警告,即此技巧仅适用于某些执行计划,如 here 所述。
问题似乎是由order by 子句引起的。没有它,我会得到所有值,但是顺序错误。我尝试按照 Microsoft 文章中的建议添加 ltrim 和 rtrim 函数以及子查询,但到目前为止没有运气。
有没有办法让 Sql Server 2016 查询引擎将来自 string_split 的有序结果连接到一个变量中?
我知道我可以使用for XML 甚至是普通光标来获得我需要的结果,但我还不想放弃这个优雅的解决方案。
当我在 Stack Exchange Data Explorer 上运行它时,我无法使用函数,因为我们没有创建这些函数的权限。我可以做存储过程,但我希望我能避开那些。
我准备了一个SEDE Query 来进行实验。预期的数据库名称要么不带点,也就是 StackOverflow,带 1 个点:StackOverflow.Meta 或 2 个点,`StackExchange.Audio.Meta,数据库的完整列表是 here
【问题讨论】:
-
为什么不data.stackexchange.com/meta.avp/query/506813?哦,关于您使用变量分配方法的愿望,永远无法保证它会起作用。 stackoverflow.com/questions/15138593/…
-
我意识到我正在使用未定义的行为,所以我也接受它作为答案。
-
没有真正回答这个问题,但是如果您正在使用所有这些字符串操作生成 URL,为什么不只使用一个查找表呢?在您的 SEDE 查询中,您已经在做一些时髦的事情(
when 'audio然后是Avp),所以为所有这些准备一个翻译表不是更好吗? -
@DavidG 到目前为止只有两种特殊情况,因为我每次都必须复制它,所以我不想在添加新站点/.databases 时有任何需要维护的东西。但我考虑过,是的。
标签: sql-server tsql sql-order-by