Необходимо преобразовать (x, y) точки, хранящиеся в SQL Server, в виде двоичного изображения в массив с плавающей точкой во время запроса - PullRequest
1 голос
/ 04 апреля 2019

(position, load) баллов хранятся в SQL Server как image. Каждый раз, когда машина перемещается, создается одна запись для сохранения этого графика положения / нагрузки вместе с другими данными.

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

У меня есть программа на C #, которая запрашивает данные из SQL и преобразует их в CSV; Тем не менее, я хочу, чтобы способ пропустить этот шаг напрямую запросить точки для просмотра / анализа в Spotfire.

Этот C # работает и делает то, что я хочу. Как я могу использовать это (или какой-либо другой вариант) для обработки данных по запросу из SQL, чтобы пользователи не запускали отдельное консольное приложение «конвертер» перед открытием своего файла Spotfire?

// Return a list of points from an array of bytes:
public static IList<PositionLoadPoint> GetPositionLoadPoints(byte[] bytes)
{
     IList<PositionLoadPoint> result = new List<PositionLoadPoint>();
     int midIndex = bytes.Length / 2;

     for (int i = 0; i < midIndex; i += 4)
     {
         byte[] load = new byte[4];
         byte[] position = new byte[4];

         Array.Copy(bytes, i, load, 0, 4);
         Array.Copy(bytes, midIndex + i, position, 0, 4);

         var point = new PositionLoadPoint(BitConverter.ToSingle(load, 0),
                                           BitConverter.ToSingle(position, 0));

        result.Add(point);
    }

    return result;
}

1 Ответ

2 голосов
/ 04 апреля 2019

Вы можете использовать табличную функцию CLR , чтобы запустить этот код C # и преобразовать двоичные данные в набор результатов.

У CLR TVF есть метод "init", который возвращаетcollection, а затем SQL запустит ваш метод FillRow для каждого члена возвращаемой коллекции.Метод FillRow переводит объект в «строку» выходных параметров.EG:

using System;  
using System.Data.Sql;  
using Microsoft.SqlServer.Server;  
using System.Collections;  
using System.Data.SqlTypes;  
using System.Diagnostics;  

public class TabularEventLog  
{  
    [SqlFunction(FillRowMethodName = "FillRow")]  
    public static IEnumerable InitMethod(String logname)  
    {  
        return new EventLog(logname).Entries;    
    }  

    public static void FillRow(Object obj, out SqlDateTime timeWritten, out SqlChars message, out SqlChars category, out long instanceId)  
    {  
        EventLogEntry eventLogEntry = (EventLogEntry)obj;  
        timeWritten = new SqlDateTime(eventLogEntry.TimeWritten);  
        message = new SqlChars(eventLogEntry.Message);  
        category = new SqlChars(eventLogEntry.Category);  
        instanceId = eventLogEntry.InstanceId;  
    }  
}
...