我需要定期从下面的链接下载数据并将其保存到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
}
}
答案 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]()