USQL 在 table 值函数中使用代码隐藏
USQL Using Code Behind in table valued function
我想在 USQL 的 TVF table 值函数中使用代码隐藏函数。这可能吗 ?
我不想注册程序集,因为该函数是 TVF 特有的,它所做的只是对输入字符串进行一些格式化。
代码隐藏
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。
我想在 USQL 的 TVF table 值函数中使用代码隐藏函数。这可能吗 ?
我不想注册程序集,因为该函数是 TVF 特有的,它所做的只是对输入字符串进行一些格式化。
代码隐藏
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。