使用Azure函数

时间:2018-03-02 07:42:10

标签: c# sql-server azure azure-functions azure-eventhub

我正在使用Azure功能从事件中心插入SQL Server中的数据。

我编写此代码以在SQL Server中插入数据,但我可以在每次执行时只插入一条消息

public static void Run(string[] eventHubMessages, TraceWriter log)
{

  SqlConnection cnn = new SqlConnection();
  cnn.ConnectionString = /* my connection string */;
  cnn.Open();

  log.Info("Connection open");

  foreach(var item in eventHubMessages)
  {
    if(item.StartsWith("{") && item.EndsWith("}"))
    {
       SqlCommand cmd = new SqlCommand("TelemetriaAttiva.ImportEvents", cnn); // call stored procedure
       cmd.Parameters.AddWithValue("Events", item);
       cmd.CommandType = CommandType.StoredProcedure;
       cmd.ExecuteNonQuery();
    }
  }
}

存储过程代码为:

CREATE PROCEDURE [TelemetriaAttiva].[ImportEvents]  @Events NVARCHAR(MAX)
AS  BEGIN 
INSERT INTO TelemetriaAttiva.Events (IDType, PayloadType, SerialNumber, Cid, 
Year, Month, Day, Hour, Minute, Second, Sid, InsDate, InsUser) 
SELECT idtype, payloadtype, serialnumber, cid, year, month, day, hour, 
minute, second, sid, insdate, insuser FROM OPENJSON(@Events)
WITH(
    IDType varchar(50) '$.idtype',
    PayloadType varchar(50) '$.payloadtype',
    SerialNumber varchar(50) '$.serialnumber',
    Cid varchar(50) '$.cid',
    Year varchar(50) '$.year',
    Month varchar(50) '$.month',
    Day varchar(50) '$.day',
    Hour varchar(50) '$.hour',
    Minute varchar(50) '$.minute',
    Second varchar(50) '$.second',
    Sid varchar(50) '$.sid',
    InsDate varchar(50) '$.insdate',
    InsUser varchar(100) '$.insuser'
) 
END 
GO

有人可以帮我插入事件中心里面的Sql Server 所有数据吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

所以,看起来您可以尝试以下方法:

  1. Concat一个JSON数组中的所有消息,例如

    var items = $"[{string.Join(",", eventHubMessages)}]";
    
  2. 将它们全部通过一次调用传递给存储过程(与现在相同的调用,但没有任何foreach循环)

    cmd.Parameters.AddWithValue("Events", items);
    
  3. 调整存储过程以期望JSON中的项目数组而不是单个项目。