2017-10-16 103 views
0
  • 我想在USQL中的TVF表值函数中使用函数后面的代码。这可能吗 ?USQL在表值函数中使用代码

  • 我不想注册程序集,因为函数对于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) 
     { 
      ... 
     } 
    } 
} 

表值函数使用

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

功能正确编译。但是当我运行它时,它会给出一个运行时错误,说它不能识别令牌Transform.其中定义的代码的名称空间

当前我正在使用解决方法代替后面的代码。但是,如果我能够理解如何使用它,函数将更加可读。

+2

当您在VS项目中使用代码隐藏文件时,该工具会自动在您的临时名称下为您注册程序集。在底层系统中,没有办法访问用户定义的代码而无需将其注册为程序集。 VS简化仅适用于在解决方案中使用相同名称配对的USQL文件和usql.cs文件。您的代码隐藏文件中的函数是否与定义了TVF的usql文件相关联? – OmidA

+0

是的,我在VS2015中使用USQL项目。我以为一样,但即使在本地调用函数也给我同样的问题 – frictionlesspulley

+0

如果你可以在Microsoft.com的bigdatatools发邮件给我,也许我们可以更快地调试你的情况。 – OmidA

回答

2

为什么代码隐藏不能用于TVF的原因是TVF需要在TVF的正文中包含所有的名称解析和引用。外部依赖(如头文件后面的代码)不会泄漏到函数体中。

我们添加了一项新功能(下一个发行说明将涵盖它),它使您可以在TVF内指定一个轻量级函数变量。例如,像(我用的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(); 

如果你希望能够重复使用的函数的变量,你应该能够给函数变量声明添加到一个包,然后导入包值在表值函数内。

相关问题