Как я могу разобрать строки логической логики? - PullRequest
0 голосов
/ 10 апреля 2010

Это будет звучать глупо, но есть ли у кого-нибудь методы, которые позволили бы мне анализировать логические строки в SQL Server 2005 без каких-либо экстраординарных / нелепых усилий?

Вот пример:

(SOMEVAR=4 OR SOMEVAR=5) AND (NOT OTHERVAR=Y)

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

Ответы [ 3 ]

1 голос
/ 10 апреля 2010

Лучше всего использовать CLR интеграция . Это облегчит поиск или разработку кода, который решит эту проблему.

0 голосов
/ 10 апреля 2010

Судя по вашему комментарию, вы должны знать, что «в конечном итоге выясните, окажется ли самое внешнее утверждение истинным или ложным», вам не нужно анализировать выражение, вам нужно его оценить. Вы можете попробовать с sp_executesql:

...
declare @sql nvarchar(max);
declare @result bit;
-- consider @expression has the expression to be evaluated
-- eg. @expression = '(@SOMEVAR=4 OR @SOMEVAR=5) AND (NOT @OTHERVAR=''Y'')';
set @sql = N'set @result=case when ' + @expression + N' then 1 else 0 end;';
exec sp_executesql @sql, N'@SOMEVAR int, @OTHERVAR vachar(max), @result bit output', @SOMEVAR, @OTHERVAR, @result output;
SELECT @result;
...

Хотя это делает то, что вам интересно (оцените выражение), у него есть серьезные проблемы:

  • он открыт для SQL-инъекций, @expression должен быть доверенным вводом
  • @ выражение может ссылаться только на локальные переменные, которые вы передаете во время sp_executesql
  • вам нужно передать все локальную переменную в sp_executesql или, по крайней мере, все локальные переменные, которые могут появиться в @ expression
  • сложно поддерживать, поскольку любая новая локальная переменная должна быть передана в sp_executesql (оба объявлены как параметр и фактически добавлены как параметр)
  • любая ошибка в @expression будет распространяться как ошибка выполнения (вы можете включить BEGIN TRY / BEGIN CATCH, чтобы предотвратить это)

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

0 голосов
/ 10 апреля 2010

Если вы получаете логические строки в качестве входных данных от какого-либо процесса (веб-сайта или чего-либо еще), вы можете использовать их для создания и выполнения динамической строки SQL. При таком подходе вы должны быть очень осторожны с инъекционными атаками.

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