Сравните таблицы данных и таблицы SQL - PullRequest
0 голосов
/ 07 июня 2018

Итак, я гуглил и искал ... Есть ли простой способ сравнить структуру таблицы таблицы SQL с данными CLR?

Вот проблема: у нас есть API, который возвращает JSON, который постоянно развивается.Когда возвращаемый массив содержит новые объекты, мы хотели бы сообщить вызывающей стороне, что доступно больше данных.

Мы можем довольно легко получить схему SQL с помощью запроса:

select COLUMN_NAME,ORDINAL_POSITION 
from information_schema.columns 
where table_name = 'ApiWork'

Но как можномы сравниваем столбец / порядковый номер с DataTable, содержащим массив JSON?Типичный возвращаемый массив будет выглядеть следующим образом:

 {"Index_0":"930477","Index_1":"test789","ArrayID":"1","Result":"OK","Order_ID":"930477","Model_Number":"FGHB2868TF","Ship_Date":"05/30/2018","Allocated":0,"Backordered":1,"Amount":0}

И мы можем построить таблицу данных с десериализатором json или с циклом:

DataTable dt = new DataTable();
        SqlPipe pipe = SqlContext.Pipe;
        String d = "";
        String col = "";
        int l = 0;
        int l2 = 0;
        int s = 0;
        int s2 = 0;
        o = "{\"Index_0\":\"930477\",\"Index_1\":\"test789\",\"ArrayID\":\"1\",\"Result\":\"OK\",\"DMI_Order_ID\":\"930477\",\"Model_Number\":\"FGHB2868TF\",\"Ship_Date\":\"05/30/2018\",\"Allocated\":0,\"Backordered\":1,\"Amount\":0}";
        int c = o.Length;
        while (c > 0)
        {
            col = o.Substring(0, o.IndexOf(":")).Replace("\"", "").Replace("{", "").Replace("}", "").Replace("[", "").Replace("]", "");
            dt.Columns.Add(col);
            l = o.IndexOf(":");
            l = l + 1;
            s = o.Length - l;
            o = o.Substring(l,s); // here we have removed the name portion
            l2 = o.IndexOf(",");
            l2 = l2 + 1;
            s2 = o.Length - l2;
            o = o.Substring(l2, s2); // here we have removed the value of the previous name

            c = o.Length;
            if (o.IndexOf(":") == -1 && o.IndexOf(",") == -1)
            {
                c = 0;
            }
        }

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

1 Ответ

0 голосов
/ 09 июня 2018

Таким образом, это, кажется, делает работу просто:

  using (SqlCommand command = new SqlCommand("Select name from tempdb.sys.COLUMNS  Where object_id=OBJECT_ID('tempdb.dbo.#ApiWork')EXCEPT Select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where table_name = 'ApiWork'"))
            {
                command.Connection = connection;
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        pipe.Send("Something is different!");
                    }else{
                        pipe.Send("we're all good!");
                    }

                }
            }

Эти два запроса могут быть проверены, чтобы видеть, отличаются ли столбцы.Кроме того,

COLUMN_ID

и

ORDINAL_ID

могут быть добавлены к запросам и затем также могут быть проверены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...