Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
SQL 2008

пытался реализовать как бы не очень заумную функцию CRL для SQL

SELECT * FROM TABLE 
WHERE FuncREGEXP (Field , Paterns,delim)=1

то есть просто использование REGEXP через NET
но Paterns включает в себе несколько шаблонов для поиска
delim разбивка этих шаблонов
для поля Field
работает и неплохо вроде как
но внутри функции каждый раз относительно каждого значения поля идёт разбивка через SPLIT
если таких полей в одной WHERE несколько то кол-во обработки увеличивается

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

Спасибо !
27 июн 13, 20:56    [14494238]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
но Paterns включает в себе несколько шаблонов для поиска
delim разбивка этих шаблонов
Не очень понятно. Пример что ли бы сразу показали.
michael R
но внутри функции каждый раз относительно каждого значения поля идёт разбивка через SPLIT
можно ли как то сохранять результаты SPLIT один раз относительно каждого скопа ?
0. Посмотрите в сторону табличных функций. Хотя APPLY также подразумевает независимый вызов.
1. Решение можно искать сместив место и время обработки:
- Делать это на клиентской стороне
- Вычислять для каждой строки заранее
2. Можете не только функциями ограничиваться. Т.е. ввести CLR тип данных, аля [RegExpPattern].
27 июн 13, 22:30    [14494556]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
FTS нету и наверно не будет
кода тута нету счас

примерно так
есть текстовое поле (или поля)
на него может быть несколько шаблонов поиска динамически(динамический SQL тоже)

F1 LIKE SH1 (AND / OR) F1 LIKE SH2
OR 
F2 LIKE SH1 (AND / OR) F2 LIKE SH2 

эти шаблоны и есть переменная PATERNS
в C# идёт разбивка и в цикле проверяются условия
работает но повторная разбивка лишнее


а как через тип ?
что бы сохранить данные ?для повторного использования ?
27 июн 13, 22:41    [14494587]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
Mnior

ага
кажется понял насчёт типа
попробую
27 июн 13, 22:57    [14494626]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
F1 LIKE SH1 (AND / OR) F1 LIKE SH2
OR 
F2 LIKE SH1 (AND / OR) F2 LIKE SH2 

WHERE	RegEx_Like(F1,'(SH1|SH2)') = 1
OR	RegEx_Like(F2,'(SH1|SH2)') = 1
Оно? Ну дык зачем delim?

И почему обработка на клиенте (аппликейшн сервере) не катит?
Что у вас за количество данных и сложные условия динамического поиска? Интересно.
И зачем вам парится что оно там "каждый раз делает одно и тоже"?
28 июн 13, 00:04    [14494832]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
SH1|SH2

это OR а если AND ??
нету такой регулярки простой


[SqlFunction]
    public static bool LikeStringsAND(string text, string patterns,string delimeter)
    {
     // Match match;
     [color=red] string[] arr = patterns.Split(new string[] { delimeter }, StringSplitOptions.None);[/color]
      bool t = false;
      for (int i = 0; i < arr.Length && !t; i++)
       {
          t &=  (Regex.IsMatch(text, arr[i], RegexOptions.IgnoreCase));
       }
       return t;
    }

вот это повтор красный

вся работа на сервере
28 июн 13, 00:21    [14494852]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
SH1|SH2
это OR а если AND ??
Это OR.
AND будет что-то типа (positive lookahead):
(?=SH1)(?=SH2)
Надо проверить.
michael R
[SqlFunction]
    public static bool LikeStringsAND(string text, string patterns,string delimeter)
    {
     // Match match;
      string[] arr = patterns.Split(new string[] { delimeter }, StringSplitOptions.None);
      bool t = false;
      for (int i = 0; i < arr.Length && !t; i++)
       {
          t &=  (Regex.IsMatch(text, arr[i], RegexOptions.IgnoreCase));
       }
       return t;
    }
Ну вы и длинно пишете на C#, а главное заковыристо (смешивать операторы моветон).
Выйти из цикла при первом совпадении, а иначе false?
Только не пойму когда &= превратит false в true?
Если это опустить, то обыкновенный OR. Сплит не нужен, пусть это сделает Regex.
michael R
вся работа на сервере
Не понял. Результат же откуда-то приходит и куда-то уходит.
28 июн 13, 00:53    [14494892]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
michael R
вся работа на сервере
Не понял. Запрос же откуда-то приходит и результат куда-то уходит.
fixed
28 июн 13, 00:56    [14494897]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
автор
Только не пойму когда &= превратит false в true?


если был хоть один false всё выходим
это же AND
на OR наоборот

я частично разобрался с типом
правда ещё не до конца
28 июн 13, 01:00    [14494900]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
автор
Только не пойму когда &= превратит false в true?

если был хоть один false всё выходим
это же AND
на OR наоборот
Туплю, ещё больше запутали.
0: t = false (изначально)
1: !t = true
2: t = t & f() -> t = false при любых f() [ t = false & f() ]
3: !t = true (всегда)
Циклим до конца.

Понимаю если бы изначально true и в условии просто t, Или t |= f().
Ослеп я что-ли?
28 июн 13, 03:00    [14494994]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
автор
Понимаю если бы изначально true


нее всё правильно
true там
я прогнал
это я написал руками а не из кода
28 июн 13, 09:57    [14495773]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
true там
Логическое AND. Ну тады как я писал:
    RegEx_Like('test','t.*t') = 1
AND RegEx_Like('test','.*st') = 1
-- =>
 OR RegEx_Like('test','(?=t.*t)(?=.*st)') = 1
28 июн 13, 10:49    [14496102]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
а если AND на разные слова
и это именно слово а не вхождение
там не простая регулярка выходит
28 июн 13, 11:59    [14496538]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
а если AND на разные слова
Ну дык разные колонки, разный вызов функции.
Вы же чётко написали:
FuncREGEXP (Field , Paterns,delim)


michael R
и это именно слово а не вхождение
Нифига не понятно. А в чём разница? Как напишите формулу, так и будет. По словам, по строкам, по всему тексту.
michael R
там не простая регулярка выходит
Какая разница? Хоть там гигабайтные формулы.

Такое ощущение что у вас срабатывает правило:
Я не знаю как это сделать, ибо не разбираюсь, поэтому это невозможно в принципе.
А когда мне говорят КАК, то это они пургу гонят.
Да, так это смотрится со стороны.
28 июн 13, 12:47    [14496850]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
если одно поле но разные слова для поиска
AND или OR
вместо того что бы писать два раз FIELD LIKE 'AAA' OR LIKE 'BBB'
один вызов для одного поля и разных регулярок
28 июн 13, 16:13    [14498238]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
если одно поле но разные слова для поиска
AND или OR
Моя твоя не нанимай
michael R
вместо того что бы писать два раз FIELD LIKE 'AAA' OR LIKE 'BBB'
один вызов для одного поля и разных регулярок
Блин, вы хотите заменить обычный LIKE Вы с дуба рухнули?
А как же индексы/оптимизация запроса?

Очередной ласапедный монстр для нагрева процов и нервов клиентов.
28 июн 13, 17:09    [14498550]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
нет
никто ничего менять в самом ДБ не будет
нужна только косметика
кроме LIKE мне нужно было избавиться от динамического SQL........
28 июн 13, 18:17    [14498794]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
автор
А как же индексы/оптимизация запроса?
Вы с дуба рухнули?


вот чисто вопрос
как индекс может помочь если конструкция вида LIKE %....% ?
и какой к чёрту индекс если поле вроде как длина МАХ
как это делать если нету FTS и не будет ?

как через LIKE искать не просто вхождение , а именно слово\слова или какая то другая конструкция с любым разделителем ?
(причём слов может быть много и кол-во не известно ) ?
единственный вариант это аж 4 LIKE по одному слову для одного поля
конечно можно оптимизировать пытаться использовать функции RIGHT+ LEFT , а это сильно поможет ?
28 июн 13, 19:37    [14498975]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
как индекс может помочь если конструкция вида LIKE %....% ?
и какой к чёрту индекс если поле вроде как длина МАХ
как это делать если нету FTS и не будет ?
Мне откуда знать? Вы же задачу не озвучили.
Просто гонять данные в функцию это не тоже самое что пользовать LIKE, даже без индексов.
И max в данном случае ещё больше усугубляет картину (или вы думаете что в функцию передаётся не по значению?!).
michael R
как через LIKE искать не просто вхождение , а именно словА
Ну дык зачем вы вообще LIKE вспомнили?!
michael R
или какая то другая конструкция с любым разделителем ?
Что вы заладили с этим разделителем?
Уже выкинули это извращение же.
michael R
единственный вариант это аж 4 LIKE по одному слову для одного поля
Причём тут цифра 4?
Вы не можете описать суть задачи. Русский вам не родной. И даже любой формализм вам не родной.
michael R
F1 LIKE SH1 (AND / OR) F1 LIKE SH2
OR 
F2 LIKE SH1 (AND / OR) F2 LIKE SH2 
Это не формализм, это чушь.
michael R
конечно можно оптимизировать пытаться использовать функции RIGHT+ LEFT , а это сильно поможет ?
Опишите суть первоначальной задачи. Что дано изначально и что надо получить.
То что надо эмулировать Full-Text Search это уже понятно.
Но причём тут AND/OR, "слова" и т.п. непонятно.

Вам надо запрос переписать в RegExp запрос и просто вызвать функцию, никаких разделителей и дополнительных параметров тут не надо.

Но фуллскан всех данных + RegExp, вместо FTS это жутко неэффективно на больших данных.
29 июн 13, 01:34    [14500026]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
есть поле (поля) описательного характера длинные
поиск в запросах стоял первоначально LIKE именно по слову или словам
если слова то берётся слово AND слово
насчёт OR это я просто делаю скорее для аналогии одной регулярки достаточно
сделать такую регулярку что бы искала (слово и слово ) или (вхождение и вхождение) в любом порядке я не смог
спрашивал тут ответа не получил
вернее (вхождение и вхождение) есть но это с переборами всех вариантов

ну LIKE аннулировал я использовал REGEXP функцию
как там вообще был построен запрос первоначально я лучше рассказывать не буду

дополнительная функция это просто моё дополнительная попытка улучшить скорость
вот и всё
29 июн 13, 11:05    [14500209]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
есть поле (поля) описательного характера длинные
В любом случае подходов просто море.
Дело в том что проблема поиска не взялась на ровном месте и проблема может трансформировать структуру хранения.
У SQL есть куча механизмов изменить структуру базы, и при этом никто ничего не заметит (кроме ускорения).
Скоре всего у вас задача тагирования (tags). И даже тут решений много. Более удачных.
michael R
сделать такую регулярку что бы искала (слово и слово ) или (вхождение и вхождение) в любом порядке я не смог
Раньше не могли, сейчас можете.
michael R
вернее (вхождение и вхождение) есть но это с переборами всех вариантов
Какими переборами?
michael R
как там вообще был построен запрос первоначально я лучше рассказывать не буду
Закидают помидорами?
michael R
дополнительная функция это просто моё дополнительная попытка улучшить скорость
IMXO, не в том направлении идёте.
29 июн 13, 19:34    [14500867]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
автор
Раньше не могли, сейчас можете.

нет! и счас не могу
тот пример не подходит

никто менять структура баз не будет !!!!
только запросы процедуры и функции
30 июн 13, 01:20    [14501357]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
никто менять структура баз не будет !!!!
только запросы процедуры и функции
А большего особо и не надо.
И почему вы такой нервный?
michael R
нет! и счас не могу
тот пример не подходит
Чем же? Может вы его не поняли или неправильно применили?

Слушайте, не мучайте себя, код явно говорит больше чем слова.
Покажите что Дано, и что Надо получить. Тем более это правило форума.
30 июн 13, 05:33    [14501513]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
нужна регулярка
поиск слово AND слово AND слово ......... в любых появлениях в тексте
или вхождение AND вхождение AND вхождение ........ в любых появлениях в тексте
тогда много чего реально изменится

нервный потому что жизнь нервная
30 июн 13, 08:52    [14501578]     Ответить | Цитировать Сообщить модератору
 Re: SQL CLR хранение глобальной переменой в скопе  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Да что тут непонятного то?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ForSimpleTests
{
    class Program
    {
        static void Main(string[] args)
        {
            var text = "нервный потому что жизнь нервная";  // SQL param
            // 1:
            //var words = new string[] { "жизнь", "потому", "что", };   // SQL table param
            //var pattern = "(?=.* " + string.Join(" .*)(?=.* ", words) + " .*)";   // SQL code emulation
            // 2:
            var words = "жизнь потому что"; // SQL Param
            var pattern = "(?=.* " + words.Replace(" ", " .*)(?=.* ") + " .*)";   // SQL code emulation
            // framing spaces - whole word
            // without - entry

            // CLR Function
            Console.WriteLine(pattern); // (?=.* жизнь .*)(?=.* потому .*)(?=.* что .*)
            var regEx = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled);
            Console.WriteLine(regEx.IsMatch(text)); // True
            Console.ReadKey();

            ////////////////////////////////////////////////////////////////////
            // Negative result

            var wordsNeg = "жизнь патаму чта"; // SQL Param
            var patternNeg = "(?=.* " + wordsNeg.Replace(" ", " .*)(?=.* ") + " .*)";   // SQL code emulation

            // CLR Function
            Console.WriteLine(patternNeg); // (?=.* жизнь .*)(?=.* потому .*)(?=.* что .*)
            var regExNeg = new Regex(patternNeg, RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled);
            Console.WriteLine(regExNeg.IsMatch(text)); // False
            Console.ReadKey();
        }
    }
}
30 июн 13, 15:46    [14501940]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить