вставлять / обновлять ссылочные данные из iothub в таблицу sql по условиям с потоковой аналитикой

Я работаю на лазурном, есть база данных транзакций sql с двумя таблицами и iotHub, который получает данные с нескольких устройств. Я должен проверить, существуют ли данные в настоящее время в базе данных, и сохранить их, если иначе не обновить старые данные в таблице.

tableOne нравится:

id   |   key1
-------------
1    |   abc
2    |   def
3    |   ghi

tableTwo нравится:

id    |   id_tableOne  |   key2         |   something
-------------------------------------------------------
77    |   2            |   Emil         |   welcome
78    |   1            |   Emil         |   here I am
79    |   1            |   Hans         |   hello world

поток как json msg, поступающий с iotHub, например:

{
    "topic": "test",
    "key1": "ghi",
    "data": [{
        "key2": "Emil",
        "something": "lmn"
    },
    {
        "key2": "Hans",
        "something": "hij"
    },
    {
        "key2": "Gerda",
        "something": "xyz"
    }]
}
  1. Я хочу получить идентификатор из tableOne с помощью «key1» в потоке json
  2. Я хочу проверить, существует ли комбинация id_tableOne (результат 1.) и key2 в tableTwo
  3. если он существует: обновить строку в tableTwo - else: вставить новую строку в tableTwo

person eid    schedule 01.08.2018    source источник


Ответы (1)


На основе потоковых данных в качестве входных данных в Stream Analytics., только eventhubs,iothubs and blob storage поддерживаются во входных данных анслитики потока Azure. Таким образом, вы не можете фильтровать условия с помощью выходной базы данных sql. Поскольку следующий sql запрещен.

SELECT 
jaysqlserver2.id as id,
jaysqlserver2.id_tableOne as idTableOne,
jaysqlserver2.key2 as key2,
jaysqlserver2.somthing as something
from jsoninput
where jaysqlserver2.id_tableOne = jsoninput.key1 

Однако я предлагаю вам обходной путь.

Во-первых, вы можете сгладить jsoninput и сохранить их во временную таблицу в целевой базе данных sql.

SELECT 
    jsoninput.key1, 
    arrayElement.ArrayValue.key2,
    arrayElement.ArrayValue.something
INTO 
    output
FROM jsoninput
CROSS APPLY GetArrayElements(jsoninput.data) AS arrayElement

введите здесь описание изображения

Затем вы можете следовать этому doc, чтобы использовать триггер времени функции Azure для автоматического управления базой данных sql. Пожалуйста, обратитесь к псевдокоду, как показано ниже:

#r "System.Configuration"
#r "System.Data"
using System.Net;
using System.Configuration;
using System.Data.SqlClient;
using System.Threading.Tasks;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    var str = ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;
    using (SqlConnection conn = new SqlConnection(str))
    {
        conn.Open();
        var text = "select temp.key1 as key1temp,temp.key2 as key2temp,
t1.id as id1,t1.key1 as key1,
t2.id as id2,t2.id_tableOne as tableOne,t2.key2 as key2,t2.something as something
from dbo.tabletemp as temp
left join dbo.table1 as t1 on temp.key1 = t1.key1
left join dbo.table2 as t2 on t1.id = t2.id_tableOne and temp.key2 = t2.key2
where t1.id is not null";

        SqlCommand sqlComm = new SqlCommand(text, conn);

        SqlDataReader reader = sqlComm.ExecuteReader();

        while(reader.Read())
        {
            string id2 = reader["id2"].ToString();
            if(id2 == null)
            {
                //execute insert sql
            }
            else
            {
                //execute update sql
            }
        }

        var delSql = "delete from dbo.temp";
        //execute delete data in temp table
        ...
    }
}

Надеюсь, это поможет вам. Любая проблема, пожалуйста, дайте мне знать.

person Jay Gong    schedule 02.08.2018
comment
Привет, Джей, спасибо за ответ. Да ваш ответ мне помог! Я не смог реализовать это прямо сейчас (время), но у меня есть идея, как это сделать! Большое спасибо за это! Кстати: это лучший способ - ›Я не уверен, но думаю, что требование хранить данные, относящиеся к другим сохраненным данным, не ново, не так ли? - person eid; 03.08.2018
comment
@eid да, я думаю, что это лучший метод, о котором я мог подумать, если вы примете этот ответ, отметьте его. Большое спасибо. - person Jay Gong; 03.08.2018