8

我想知道,是否有任何方法可以将列名添加到 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 中添加别名: 在此处输入图像描述

4

3 回答 3

4

答案是不。” 标量函数(无论是否为 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 函数。

于 2013-05-15T22:50:57.023 回答
2

我假设你在某个地方有这样的电话:

command.CommandText = "SELECT SomeFunction();";

尝试这个

command.CommandText = "SELECT SomeFunction() 'AliasForColumnNameYouWant';";

不确定 20 或 30 个函数是什么意思?

你是说在 Sql-Server 中有一些存储过程或函数调用 20 或 30 个不同的标量函数?

或者同一个函数可能被调用了 20 次或 30 次?

您是否将结果组合成可返回的数据行或列?

请需要代码示例。

于 2013-05-15T19:55:36.870 回答
-1

标量函数可以看作是表达式的等价物,SQL 不请求作为表达式乘积返回的列的名称。在 SQL 中,如果你想返回一个带有列名的表达式,你必须用以下两种方式中的任何一种来给它起别名:

Select MyCol=Substring('123',2,1)

或者

Select Substring('123',2,1) as MyCol

如果您想在查询中的其他一些地方重用别名来构建另一个表达式(我更喜欢 Alias=Expression)

Select MyExp2=MyExp+'2', MyExp3=MyExp+3, MyExp4
From 
  SomeTable
  CROSS APPLY (Select MyExp=Substring(SomeTable.SomeCol, 2, 1)) as MyExp
  -- below an example of reusing MyExp in another apply
  CROSS APPLY (Select MyExp4= MyExp + Substring(SomeTable.SomeCol, 4, 1)) as MyExp
于 2022-01-21T22:16:15.600 回答