2016-05-04 21 views
0

私は以下のようなリンクから定期的にデータをダウンロードし、それをMSデータベースに保存する必要があります。私はWebClientクラスでCLR機能を作ったが、すべての行が一列に並んでいるので、私はそれを分ける必要がある。CLR関数の配列を返す

私はデータを配列に保存し、splitを使ってループで戻すことを考えましたが、データベースに保存するために1行ずつ返す方法はわかりません。

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は、本当に言うあたりの「アレイ」をサポートしていないと、一般的に私は、Webページを解析し、別のサービスやアプリケーションを開発することをお勧めして、単にあなたのためにフォーマットされた表に必要なデータを挿入ニーズ。 CLRを使用してWebページを照会すると、CLRをUnsafe to SQL Serverとして公開する必要があります。一部の組織では、サーバー上でCLRが安全でないとマークされることは許可されません。

テーブル値のCLR関数を作成することができます。これにより、標準表のように関数から結果を照会することができます。以下は、これを達成する方法のコード例は次のとおりです。

SELECT [RowNr] 
      ,[SampleValue] 
    FROM [dbo].[MyClrTableValuedFunction]() 
:あなたは次のようにSQL Serverで標準のselect文としてあなたの関数を呼び出すことができます
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; 
     } 
    }