2017-10-16 58 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(); 

如果你希望能夠重複使用的函數的變量,你應該能夠給函數變量聲明添加到一個包,然後導入包值在表值函數內。

相關問題