通过SQLCLR消耗Rest API并通过SqlPipe发送结果

时间:2018-06-21 12:51:25

标签: c# sql-server rest sqlclr

我正在尝试通过CLR存储过程使用rest / json get api。我的问题是我只得到一个(最后一个)记录。

这是我的代码:

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void FrtApiJsonGet ()
    {

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("some site");

        var byteArray = Encoding.ASCII.GetBytes("login:password");

        request.Method = "GET";
        request.Headers.Add(HttpRequestHeader.Authorization, "Basic " + 
                Convert.ToBase64String(byteArray));

        using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            using (Stream receiveStream = response.GetResponseStream())
            {
                using (StreamReader readStream = new StreamReader(receiveStream,
                  Encoding.UTF8))
                {
                    string strContent = readStream.ReadToEnd();

                    string value1 = string.Empty;
                    string value2 = string.Empty;
                    string value3 = string.Empty;
                    string value4 = string.Empty;


                    SqlPipe pipe = SqlContext.Pipe;
                    SqlMetaData[] cols = new SqlMetaData[4];
                    cols[0] = new SqlMetaData("value1", SqlDbType.NVarChar, 50);
                    cols[1] = new SqlMetaData("value2", SqlDbType.NVarChar, 50);
                    cols[2] = new SqlMetaData("value3", SqlDbType.NVarChar, 50);
                    cols[3] = new SqlMetaData("value4", SqlDbType.NVarChar, 50);

                    SqlDataRecord record = new SqlDataRecord(cols);
                    pipe.SendResultsStart(record);

                    var strArray = strContent.Split(new string[] { "{,}" },
                                      StringSplitOptions.None);

                    foreach(var str in strArray)
                    {
                        var subArray = str.Split(',');
                        foreach (var substr in subArray)
                        {
                            if (substr.Contains("\"value1\""))
                                value1 = substr.Split('\"')[3];

                            if (substr.Contains("\"value2\""))
                                callKey = substr.Split('\"')[3];

                            if (substr.Contains("\"value3\""))
                                callPhase = substr.Split('\"')[3];

                            if (substr.Contains("\"value4\""))
                                callresult = substr.Split('\"')[3];
                        }
                        record.SetSqlString(0, new SqlString(value1));
                        record.SetSqlString(1, new SqlString(value2));
                        record.SetSqlString(2, new SqlString(value3));
                        record.SetSqlString(3, new SqlString(value4));

                        pipe.SendResultsRow(record);


                        value1 = string.Empty;
                        value2 = string.Empty;
                        value3 = string.Empty;
                        value4 = string.Empty;
                    }

                    pipe.SendResultsEnd();

                }
            }
        }

    }
}

我知道api可以正常工作,并且如果我在控制台应用程序中尝试不带sqlpipe的相同代码,它会返回值列表...但是当用作clr存储过程时,我只会得到一个(最后一个)记录。

1 个答案:

答案 0 :(得分:1)

SendResultsStartSendResultsRowSendResultsEnd的处理而言,总体结构似乎是正确的。

下一个要检查的地方是循环本身。最初的Split很可能没有按照您认为的那样发生。您应该在pipe.Send(str);之前加入var subArray = str.Split(',');,以便了解如何将响应分成几行。这会将每个块发送到“消息”选项卡,以便您可以对其进行调试(与通过T-SQL进行PRINT一样)。