2016-05-04 96 views
0

我需要定期從下面的鏈接下載數據並將其保存到MS數據庫中。我使用WebClient類創建了CLR函數,但everythig在一行中,我需要將它分開。在CLR函數中返回數組

我想到了將數據保存在數組中,使用split並在循環中返回它,但我不知道如何逐行返回以將其保存在數據庫中。

public partial class UserDefinedFunctions 
{ 

private static readonly WebClient webClient = new WebClient(); 

[Microsoft.SqlServer.Server.SqlFunction] 
public static SqlString DownloadSynop(string uri) 
{ 
    string synop = webClient.DownloadString(uri); 
    string[] lines = synop.Split(new string[] { Environment.NewLine, "\n", "\"r" }, StringSplitOptions.None); 

    for (int i=0; i<lines.Length - 1; i++) 
    { 
     string kod = lines[i];   

    } 

    return new SqlString(kod); //problem 
} 
} 

回答

0

SQL Server不真正支持「陣列」每說和一般我會建議您開發解析網頁一個單獨的服務或應用程序,然後只需將所需的數據到格式化的表格上需要。使用CLR查詢網頁意味着您必須將CLR作爲不安全發佈到SQL Server。某些組織不允許CLR在其服務器上標記爲不安全。

話雖如此,你可以創建一個表值CLR函數。這將允許你像你的標準表一樣從你的函數中查詢你的結果。下面是如何可以實現這樣的代碼示例:

public partial class UserDefinedFunctions 
    { 

     private struct Record 
     { 
      public int RowNr; 
      public string SampleValue; 
     } 


     [SqlFunction(FillRowMethodName = "MyClrTableValuedFunction_FillRow", 
      TableDefinition = "[RowNr] INT, [SampleValue] NVARCHAR(50)")] 
     public static IEnumerable MyClrTableValuedFunction() 
     { 
      ArrayList list = new ArrayList(); 

      for (int sampleRowNr = 0; sampleRowNr < 100; sampleRowNr++) 
      { 
       Record sampleRecord = new Record(); 
       sampleRecord.RowNr = sampleRowNr; 
       sampleRecord.SampleValue = string.Format("Sample Value: {0}", sampleRowNr); 

       list.Add(sampleRecord); 
      } 

      return list; 
     } 


     public static void MyClrTableValuedFunction_FillRow(Object obj, out SqlInt32 rowNr, out SqlString sampleValue) 
     { 
      Record record = (Record)obj; 

      rowNr = record.RowNr; 
      sampleValue = record.SampleValue; 
     } 
    } 

您可以在SQL Server中調用函數作爲一個標準的select語句如下:

SELECT [RowNr] 
      ,[SampleValue] 
    FROM [dbo].[MyClrTableValuedFunction]()