USQL 在 table 值函数中使用代码隐藏

USQL Using Code Behind in table valued function

代码隐藏

using System;

namespace Transform
{
    public class Formatter
    {
        private static DateTime DefaultDateTime = DateTime.Parse("1/1/2004");

        public static DateTime ToDateTime(string date, string format)
        {
            ...
        }

        public static DateTime? ToNullableDateTime(string date, string format)
        {
            ...
        }
    }
}

Table 值函数使用

SELECT
            rec.id,
            rec.name,
            Transform.Formatter.ToDateTime(rec.effectiveDate,  "yyyyMMdd"),
            Transform.Formatter.ToNullableDateTime(rec.expirationDate, "yyyyMMdd")

函数编译正确。然而,当我 运行 它给出一个 运行 时间错误,说它不识别令牌 Transform. 定义代码背后的命名空间

目前我正在使用变通方法代替后面的代码。但是,如果我能理解如何使用它,该函数将更具可读性。

code-behind 对 TVF 不起作用的原因是 TVF 需要在 TVF 的 body 中具有所有名称解析和引用。外部依赖项(如 header 后面的代码)不会泄漏到函数 body.

我们添加了一项新功能(下一个发行说明将介绍它),使您能够在 TVF 中指定 light-weight 函数变量。例如,类似(我以 TryParse 为例):

CREATE FUNCTION f() RETURNS @res AS
BEGIN
    DECLARE @myfunc Func<int,string> = (f) => f.ToString();
    DECLARE @TryParseInt Func<string,int?> = (s) => {int i; var b = Int32.TryParse(s, out i); return b? (int?) i : null;};

    @res =
    SELECT @myfunc(1) AS intcol,
           @TryParseInt("42") AS stringcol
    FROM(
        VALUES
        (
            1
        )) AS T(x);
END;

OUTPUT f() TO "/output/f.csv" USING Outputters.Csv();

如果您希望能够重用函数变量,您应该能够将函数变量声明添加到 PACKAGE 中,然后在 table-valued 函数中导入 PACKAGE。