在CLR函数中返回数组

时间:2016-05-04 17:10:20

标签: c# sql-server clr

我需要定期从下面的链接下载数据并将其保存到MS数据库。我用WebClient类创建了CLR函数但是everythig在一行中,我需要将它分开。

我有想法将数据保存在数组中,使用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
}
}

1 个答案:

答案 0 :(得分:1)

SQL Server并不真正支持“Arrays”,一般来说,我建议您开发一个单独的服务或应用程序来解析网页,然后只需将所需数据插入到根据您的需要格式化的表中。使用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]()