我想知道,是否有任何方法可以将列名添加到 Sql Server 中的 CLR 标量函数。我的意思是,在我运行查询之后,我希望看到一个列,其中该函数的结果已经用自定义而不是(No column name)
.
我知道函数经常组合在一起,或者出于其他原因我不得不为它们命名不同的名称,但是仍然 - 当您编写一个包含 30 列的查询时,不必为其中的 20 列输入别名会很好。
那么有人知道可以实现这一点的黑客吗?
通过 SSMS 中的一些插件拥有此功能也很不错(例如,从计算中使用的函数和列构建虚拟别名,例如“datediff_startdate_enddate”)。我试图找到一个现成的解决方案,但没有效果。有什么提示吗?
编辑:有人问我代码示例。我认为这不会有太大帮助,但这里是:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlTypes;
using System.Text.RegularExpressions;
namespace ClrFunctions
{
public class RegexFunctions
{
public static SqlBoolean clrIsMatch(SqlString strInput, SqlString strPattern)
{
if (strPattern.IsNull || strInput.IsNull)
{
return SqlBoolean.False;
}
return (SqlBoolean)Regex.IsMatch(strInput.Value, strPattern.Value, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
}
}
}
T-SQL:
Create Assembly ClrFunctions From 'C:\CLR\ClrFunctions.dll'
GO
Create Function dbo.clrIsMatch(
@strInput As nvarchar(4000),
@strPattern As nvarchar(255)
)
Returns Bit
As External Name [ClrFunctions].[ClrFunctions.RegexFunctions].[clrIsMatch]
GO
这是我希望在 T-SQL 中调用这个函数和预期的结果:
select
txt, dbo.clrIsMatch(txt,'[0-9]+')
from (
select 'some 123 text' as txt union all
select 'no numbers here' union all
select 'numbers 456 again'
) x
Result 已经有了列名,无需在 T-SQL 中添加别名: