在早期版本上创建用户定义的函数,例如 SQL Server 2017 STRING_AGG

oCc*_*ing 5 sql-server user-defined-functions string-aggregation

我尝试创建一个通用函数,可以像在 SQL Server 2017 上使用新的 string_agg 内置函数的示例一样使用

内部实现可以类似于以下内容

with tbl as(
   select a.Id, c.Desc
     from TableA a
     join TableB b on b.aId = a.Id
     join TableC c on c.Code = b.bCode 
)  
select distinct ID
     , STUFF(( select ', ' + Desc from tbl t where t.ID = tbl.ID 
            for xml path(''),TYPE).value('.','VARCHAR(MAX)'),1,2,'') Desc   
from tbl
Run Code Online (Sandbox Code Playgroud)

但是如何接收字段键、要连接的字段、分隔符和范围选择上下文呢?Inline与或Multi-Statement Table-Valued Functions相关吗?

oCc*_*ing 4

好的..因此,随着 @Micha\xc5\x82Turczyn 的第一条评论,我遇到了这篇关于CLR 用户定义聚合 - 调用函数的Microsoft 文章

\n\n

将代码编译到 SrAggFunc.dll 后,我尝试在 SQL Server 中注册聚合,如下所示:

\n\n
CREATE ASSEMBLY [STR_AGG] FROM \'C:\\tmp\\STR_AGG.dll\'; \nGO\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我收到以下错误。

\n\n
\n

Msg 6501,Level 16,State 7,Line 1
\n CREATE ASSEMBLY 失败,因为无法打开物理文件 \'C:\\tmp\\SrAggFunc.dll\': 3(系统找不到指定的路径。) 。

\n
\n\n

所以我使用了@SanderRijken代码的这个优秀部分,然后将命令更改为

\n\n
CREATE ASSEMBLY [STR_AGG] \nFROM 0x4D5A90000300000004000000FF......000; --from GetHexString function\nGO\n
Run Code Online (Sandbox Code Playgroud)\n\n

进而,

\n\n
CREATE AGGREGATE [STR_AGG] (@input nvarchar(200)) RETURNS nvarchar(max) \nEXTERNAL NAME [STR_AGG].C_STRING_AGG;`\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在已经完成了。

\n\n

您可以在 SSMS 上的数据库 -> 可编程性下看到它

\n\n

聚合函数和程序集

\n\n

并使用如下:

\n\n
SELECT a.Id, [dbo].[STR_AGG](c.Desc) cDesc\nFROM TableA a\nJOIN TableB b on b.aId = a.Id\nJOIN TableC c on c.Code = b.bCode \nGROUP BY a.Id\n
Run Code Online (Sandbox Code Playgroud)\n\n

谢谢大家 =)

\n

  • 很高兴您找到了一个好的解决方案!您的路径问题可能是由于 SqlServer 在许多安装中没有看到与您相同的“c:” (2认同)