sql server 2016 中的 String_agg
Posted
技术标签:
【中文标题】sql server 2016 中的 String_agg【英文标题】:String_agg in sql server 2016 【发布时间】:2019-06-30 09:06:25 【问题描述】:这是我在 sql server 2016 中的代码
insert into @entdef_queries(entitydefid,squery)
select A.entitydefid
,
(
select String_agg(cols,ioperator)
from
(
Select case when lower(b.metricdatatype) like 'string%' or lower(b.metricdatatype) like '%char%' or lower(b.metricdatatype) ='bit' or lower(b.metricdatatype) like 'date%' then
' lower("'+ b.metricname +'") ' + b.metriccondition +' '''+ b.value1 +''' '
when lower(b.metricdatatype) not like 'string%' and lower(b.metricdatatype) like '%char%' and lower(b.metricdatatype) !='bit' and lower(b.metricdatatype) not like 'date%' then
case when lower(b.metriccondition)='between' then ' "'+ b.metricname +'"' + b.metriccondition +' '+ b.value1 +' and ' + b.value2 + ' '
else ' "'+ b.metricname +'"' + b.metriccondition +' '+ b.value1 + ' ' end
end cols
, ( select distinct operators from @entdef_data C where A.entitydefid=C.entitydefid) ioperator
from
@entdef_data B
where A.entitydefid=b.entitydefid
)inp
)
from
@entdef_data A
group by A.entitydefid;
当我尝试执行以下代码时..它抛出错误String_agg
不是内置函数。
【问题讨论】:
string_agg()
从 2017 年开始可用,而不是 2016 年。升级 SQL Server 或使用for xml
方法。
【参考方案1】:
正如 Gordon Linoff 所说,此功能在 SQL Server 2016 中不可用。
将使用for xml
方法。
从 SQL Server 2005 开始,可以使用略为 faster 的替代方案:SQLCLR GROUP_CONCAT
。
用法与本机 STRING_AGG 非常相似。但是因为它是一个自定义的 CLR 聚合,它引入了自己的风险:要启用 CLR、可能的内存泄漏等。
文档: https://orlando-colamatteo.github.io/ms-sql-server-group-concat-sqlclr/
【讨论】:
以上是关于sql server 2016 中的 String_agg的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2012/2016/2017 新增函数
在STRING_SPLIT中使用Where IN并在SQL Server 2016中使用汇总计数
使用 SQLBulkCopy - SQL Server 2016 中的表比 SQL Server 2014 中的表大得多