Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
SergASh Member Откуда: Сообщений: 167 |
Привет всем! Есть таблица, в которой хранятся геометрические размеры объектов. Также есть таблица, где описаны ограничения, которым эти размеры должны удовлетворять. Ограничение определяется формулой, связывающей арифметическое выражение с числовой константой через знак неравенства. Задача найти все объекты, которые не удовлетворяют условиям, точнее все комбинации объектов и нарушенных ими ограничений. Всё сводится к тому, что надо вычислить арифметическое выражение, которое на момент написания кода неизвестно. Но в лоб составить и выполнить динамический запрос страшно, потому что формулы приходят в систему извне и там что угодно может быть. Кроме того, надо быть уверенным, что в выражении присутствуют только предопределенные переменные (в примере ниже это только Length, Width и Height). Что посоветуете?
|
|
19 фев 16, 18:43 [18842795] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
SergASh, ИМХО делать это на уровне sql извращение, а так либо разбирать формулу на атомы и проверять логику. Извращённо: можно выкинуть из формулы Replace-ом все свои поля, пробелы мат. знаки(хотя если в конце "+" напишут то уже ошибка) , и анализировать что осталось, кроме того числовые значения могут быть как 1.1 так и 1,1 кол-во и парность скобок... Вообщем изврат :) |
19 фев 16, 18:52 [18842821] Ответить | Цитировать Сообщить модератору |
Ferdipux Member Откуда: Москва Сообщений: 584 |
SergASh, .Net CLR сборку с методом, куда передавать что вы хотите посчитать. Вычисляется вне ядра SQL, логика там может быть развесистая + можно использовать существующие библиотеки для парсинга. |
19 фев 16, 19:26 [18842915] Ответить | Цитировать Сообщить модератору |
SergASh Member Откуда: Сообщений: 167 |
Ferdipux, Да вот как раз CLR я бы и не хотел испльзовать. Пока склоняюсь к динамическому запросу. Но пока не понимаю как его выполнить от имени пользователя, который не сможет навредить. |
19 фев 16, 19:47 [18843001] Ответить | Цитировать Сообщить модератору |
Mike_za Member Откуда: Москва Сообщений: 1176 |
SergASh, Execute as? |
19 фев 16, 22:17 [18843526] Ответить | Цитировать Сообщить модератору |
leov Member Откуда: С-Петербург Сообщений: 616 |
SergASh, ну во первых наверное стоит предложить это сделать на клиенте на мой взгляд там ловчее ошибки обрабатывают, хотя теоретически можно и на сервере... далее по моему надо четко определить что совершенно произвольного выражения тут не должно быть выражения должен составлять программист, а не юзер, это без вариантов юзер даже в экселе какой нибедь бесконечный цикл закрутит и повесит все... ну а если пишет программист то в общем будет обычный программный код при добавлении/изменении цифр проверять их по всем формулам при добавлении/изменении формулы проверять их по всем цифрам ну а если все проверено то собирай как хочешь и исполняй exec-ом я похожую вещь реализовал у себя, доступ к страницам приложения так разграничивал довольно криво и сложно получилось, но работает до сих пор |
20 фев 16, 00:35 [18843828] Ответить | Цитировать Сообщить модератору |
leov Member Откуда: С-Петербург Сообщений: 616 |
SergASh, извиняюсь, попалась тема с которой сам долго работал и полез советовать перечитал что в названии именно "неизвестное выражение" а я совсем не про то... |
20 фев 16, 00:42 [18843836] Ответить | Цитировать Сообщить модератору |
SergASh Member Откуда: Сообщений: 167 |
leov, Под спойлером я привел пример того, что хотелось бы получить. Выражение - только 4 арифметических действия и скобки. Выражения вводят хоть и не программисты, но ответственные операторы тех.поддержки. |
20 фев 16, 14:46 [18846285] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20964 |
C одной стороны
С другой
Как я понимаю, теоретически несложно заставить их вводить выражения по строго заданной форме. В этом случае я бы предложил изменить формат выражения, доведя его до состояния "как в калькуляторе" - в такой форме значение выражения легко может быть посчитано достаточно несложной функцией. |
||||
20 фев 16, 15:37 [18846692] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9636 |
SergASh, Дорабатывайте по вкусу
|
|
20 фев 16, 15:47 [18846738] Ответить | Цитировать Сообщить модератору |
ЦБ Member [заблокирован] Откуда: Сообщений: 2773 |
use tempdb go create FUNCTION dbo.fnEval(@expression varchar(8000)) RETURNS @result TABLE (Result sql_variant) AS BEGIN DECLARE @object int DECLARE @res sql_variant DECLARE @hr int -- EXEC @hr=sp_OACreate 'ScriptControl', @object OUT EXEC @hr=sp_OASetProperty @object, 'Language', 'vbscript' EXEC @hr=sp_OAMethod @object, 'Eval', @res OUT, @expression EXEC @hr=sp_OADestroy @object -- insert into @result select @res -- RETURN END GO ---------------------------- select b.*, c.* ,replace(replace(replace(c.Formula,'Length',str(b.Length)),'Width',str(b.Width)),'Height',str(b.Height)) as expr ,a.Result from tblBox b cross join tblConstraint c cross apply dbo.fnEval(replace(replace(replace(Formula,'Length',str(Length)),'Width',str(Width)),'Height',str(Height))) a where a.Result='False'
|
|||||||||||||||||||||||||||||||||||||||||||||||||
20 фев 16, 18:34 [18847310] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |