c# – 具有默认列名的SQL Server CLR标量函数

我想知道,如果有任何方法可以在Sql Server中为我的CLR标量函数添加列名.我的意思是,在我运行查询之后,我希望看到一个包含此函数结果的列已经使用自定义而不是(无列名称)命名.

我知道通常将函数组合在一起,或者由于其他原因我不得不将它们命名为不同的东西,但仍然 – 当您编写一个包含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

结果已经有一个列名,无需在T-SQL中添加别名:

最佳答案
答案是不.”标量函数(CLR与否)只返回一个值.

“用户定义的标量函数返回RETURNS子句中定义的类型的单个数据值.”每MSDN

正如您所建议的那样,正确的解决方案是在您使用该函数的位置添加别名.

SELECT ABS(a.Position - b.Position) AS Distance
    FROM sch.Tbl a
        INNER JOIN sch.Tbl b
            ON a.Key <= b.Key
;

并且这不会改变函数是内置函数,用户定义函数还是CLR函数.

转载注明原文:c# – 具有默认列名的SQL Server CLR标量函数 - 代码日志