0

我已经创建了一个这样的 CLR 函数

public class GETJSONFROMURL
{
   [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString GETData(SqlString URL) 
    {
        SqlString Data = "N/A";


        using (var webClient = new System.Net.WebClient())
        {

            var json = webClient.DownloadString(new Uri(URL.ToString()));
            // Now parse with JSON.Net
            JObject o = JObject.Parse(json);
            Data = (string)o["Data_results"]["MyData"];


        }
        return Data;


    }
}

并在 Sql 中创建了一个函数 像这样

CREATE ASSEMBLY GetDataURL
FROM 'C:\GETJSONFROMURL.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS

CREATE FUNCTION GetDataURL (@URL NVARCHAR(MAX))
RETURNS NVARCHAR(MAX) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME GetDataURL.GETJSONFROMURL.GETData

当我在查询窗口中选择此功能时,我会在 0.03 秒内非常快地得到结果

SELECT [dbo].[GetDataURL] ('http://www.Testserver.com/123') 

但是当我将此函数调用为多个调用时,例如在插入某些调用选择后的触发器内部时,我会延迟获取结果。

你能帮我创建一个异步函数,当我在 sql 内部调用时,因为多次调用没有延迟返回结果。

谢谢

4

1 回答 1

2

您可以创建一个 SQL Server 代理作业,该作业每 5 分钟更新一次表(或多或少取决于您的要求),而不是在触发器中执行此操作。

该作业可以为尚未插入数据的每一行调用一次您的 CLR 函数。

但是,我强烈建议您让客户端软件从 URL 中获取数据并将其插入到表中。

您可以考虑让一台单独的机器获取新插入行的 json 数据;这减轻了 SQL Server 的负担,并使客户端不必担心获取数据。

于 2013-10-16T02:31:40.403 回答