Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
Всем привет!

Есть набор слов она же фраза, например "Привет мир", мне нужно из базы получить все записи которые содержат слова "Привет" и "мир"

как вариант делаю так

declare
 @SQL nvarchar(max),
 @GoogleStr nvarchar(max) = 'Привет мир'

 -- разделение строки поиска на части
 -- ....
 set @SQL = 'select * from MyTable where f1 like(''%''привет''%'') and f1 like(''%''мир''%'')'
 
 -- запрос 
 exec sp_executesql @SQL


вопрос: как избежать SQL инъекций?

версия сервера: Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64)
Oct 19 2012 13:38:57
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
15 дек 15, 15:41    [18563418]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mandarin
вопрос: как избежать SQL инъекций?

Открыть для себя FullTextSearch
15 дек 15, 15:45    [18563459]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Mandarin,

'Кумир' тоже подойдёт?
15 дек 15, 15:46    [18563463]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
MKDT
Guest
Отдельно указывать параметры:
declare @myparam AS NVARCHAR(60);
EXEC sp_executesql @statement = N'SELECT @myparam ', @params = N'@myparam NVARCHAR(60)', @myparam = N'test';


Если хотите, что-бы поиск работал быстро (если данных много) следует заменить like на полнотекстовый поиск (full-text)
15 дек 15, 15:48    [18563482]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
MKDT
Отдельно указывать параметры:
declare @myparam AS NVARCHAR(60);
EXEC sp_executesql @statement = N'SELECT @myparam ', @params = N'@myparam NVARCHAR(60)', @myparam = N'test';



Если хотите, что-бы поиск работал быстро (если данных много) следует заменить like на полнотекстовый поиск (full-text)
А зачем динамический запрос, понять не могу?
15 дек 15, 16:03    [18563589]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
MKDT
Guest
iap,

Там есть @GoogleStr + "как избежать SQL инъекций?"
15 дек 15, 16:06    [18563603]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
спасибо за подсказки, про FullTextSearch я знаю, использую его в своей работе, но в данном случае он мне не подходит, почему не спрашивайте, просто не подходит. Прошу помочь в конкретном вопросе. Предложение использовать параметры хорошее, но количество частей слов может быть разным, как описать запрос чтобы количество параметров было динамическим?
15 дек 15, 16:08    [18563617]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
iap
MKDT
Отдельно указывать параметры:
declare @myparam AS NVARCHAR(60);
EXEC sp_executesql @statement = N'SELECT @myparam ', @params = N'@myparam NVARCHAR(60)', @myparam = N'test';



Если хотите, что-бы поиск работал быстро (если данных много) следует заменить like на полнотекстовый поиск (full-text)
А зачем динамический запрос, понять не могу?


запрос может быть любым самое главное для меня я описал в первом посте " мне нужно из базы получить все записи которые содержат слова "Привет" и "мир""
15 дек 15, 16:09    [18563623]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
MKDT
Guest
Хотя да, динамический запрос тут не нужен.


select * from MyTable 
WHERE CONTAINS(f1,REPLACE(@GoogleStr,’ ’,AND))
15 дек 15, 16:10    [18563632]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
MKDT
Хотя да, динамический запрос тут не нужен.


select * from MyTable 
WHERE CONTAINS(f1,REPLACE(@GoogleStr,’ ’,AND))


для contains нужен полнотекстовый индекс, у меня его нет.
15 дек 15, 16:14    [18563658]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Mandarin
iap
пропущено...
А зачем динамический запрос, понять не могу?


запрос может быть любым самое главное для меня я описал в первом посте " мне нужно из базы получить все записи которые содержат слова "Привет" и "мир""
Распарсить @GoogleStr до датасета с одним словом на каждой строке,
отфильтровать таблицу EXISTSом с условием разделитель+поле таблицы+разделитель LIKE '%'+разделитель+слово из @GoogleStr+разделитель+'%'.
(для того, чтобы отловить именно слова, а не части более длинных слов,
и для того, чтобы учесть слова в самом начале и в самом конце строки)
15 дек 15, 16:18    [18563679]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
MKDT
Guest
select * from MyTable 
where f1 like '%'+@WORD1+'%' and f1 '%'+@WORD2+'%'

select * from MyTable 
where CHARINDEX(@WORD1,f1)!=0 and CHARINDEX(@WORD2,f1)!=0
15 дек 15, 16:19    [18563685]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
iap
Mandarin
пропущено...


запрос может быть любым самое главное для меня я описал в первом посте " мне нужно из базы получить все записи которые содержат слова "Привет" и "мир""
Распарсить @GoogleStr до датасета с одним словом на каждой строке,
отфильтровать таблицу EXISTSом с условием разделитель+поле таблицы+разделитель LIKE '%'+разделитель+слово из @GoogleStr+разделитель+'%'.
(для того, чтобы отловить именно слова, а не части более длинных слов,
и для того, чтобы учесть слова в самом начале и в самом конце строки)


такой запрос возвращает строки в который встречается только одно слово "привет" или "мир", а мне нужно чтобы возвращалась строка где встречаются оба слова.
15 дек 15, 16:27    [18563739]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
mishanya3624
Member

Откуда:
Сообщений: 795
MKDT
select * from MyTable 
where f1 like '%'+@WORD1+'%' and f1 '%'+@WORD2+'%'

select * from MyTable 
where CHARINDEX(@WORD1,f1)!=0 and CHARINDEX(@WORD2,f1)!=0

ну вот же вам подсказали
15 дек 15, 16:28    [18563745]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Mandarin
iap
пропущено...
Распарсить @GoogleStr до датасета с одним словом на каждой строке,
отфильтровать таблицу EXISTSом с условием разделитель+поле таблицы+разделитель LIKE '%'+разделитель+слово из @GoogleStr+разделитель+'%'.
(для того, чтобы отловить именно слова, а не части более длинных слов,
и для того, чтобы учесть слова в самом начале и в самом конце строки)


такой запрос возвращает строки в который встречается только одно слово "привет" или "мир", а мне нужно чтобы возвращалась строка где встречаются оба слова.
Это "реляционное деление".
Легко реализовать с помощью NOT EXISTS().
Тут главное вместе собрать все перечисленные алгоритмы.
Все они тут обсуждались десятки раз - например, получение таблицы слов строки.
Подозреваю, для всего этого дела можно и XML как-то прикрутить, но тут я пас...
15 дек 15, 16:31    [18563758]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
mishanya3624
MKDT
select * from MyTable 
where f1 like '%'+@WORD1+'%' and f1 '%'+@WORD2+'%'

select * from MyTable 
where CHARINDEX(@WORD1,f1)!=0 and CHARINDEX(@WORD2,f1)!=0

ну вот же вам подсказали


спасибо, это надо еще осмыслить как применить :)

пока вот что я имею

declare
 @XML xml = '<h><r><f1>привет</f1></r><r><f1>мир</f1></r></h>',
 @h int
 
 create table #MyTable(f1 varchar(100))
 insert into #MyTable values('привет')
 insert into #MyTable values('мир')
 insert into #MyTable values('привет мир')

 exec sp_xml_preparedocument @h out, @XML
 
 create table #Tmp(f1 varchar(250))
 insert into #Tmp(f1)
 select f1
 from openxml(@h,'/h/r',2) with (f1 varchar(250))
 
 exec sp_xml_removedocument @h
 
 select mt.f1 
 from #MyTable mt with (nolock) 
 where exists(
  select * 
  from #Tmp t 
  where ' '+mt.f1 +' ' LIKE '%'+' '+t.f1+' '+'%')

 drop table #tmp
 drop table #MyTable
15 дек 15, 16:31    [18563759]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
MKDT
select * from MyTable 
where f1 like '%'+@WORD1+'%' and f1 '%'+@WORD2+'%'

select * from MyTable 
where CHARINDEX(@WORD1,f1)!=0 and CHARINDEX(@WORD2,f1)!=0


тут не совсем понятно... если у меня динамическое количество составных частей то и количество параметров будет динамическое, если динамическое то возвращаемся к моему первому посту.
15 дек 15, 16:35    [18563783]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
Mandarin,

вот за это
select * from MyTable 
where CHARINDEX(@WORD1,f1)!=0 and CHARINDEX(@WORD2,f1)!=0


отдельное спасибо! работает быстрее чем like.
15 дек 15, 16:38    [18563796]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
declare
 @XML xml = '<h><r><f1>привет</f1></r><r><f1>мир</f1></r></h>',
 @h int
 
declare @MyTable table (f1 varchar(100))
 insert into @MyTable values('привет')
 insert into @MyTable values('мир')
 insert into @MyTable values('привет мир')

 exec sp_xml_preparedocument @h out, @XML
 
 declare @Tmp table(f1 varchar(250))
 insert into @Tmp(f1)
 select f1
 from openxml(@h,'/h/r',2) with (f1 varchar(250))
 
 exec sp_xml_removedocument @h
 
 
 select M.f1 as [frase], T.f1 as [word] from @MyTable M INNER JOIN @Tmp T ON M.f1 LIKE '%' + T.f1 + '%'
15 дек 15, 16:40    [18563805]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
Konst_One,

результат не тот что нужен, нужна только одна строка "привет мир", ваш пример возвращает все строки.
15 дек 15, 16:44    [18563818]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
Mandarin
мне нужно из базы получить все записи которые содержат слова "Привет" и "мир"


 Declare @cnt int
 
 set @cnt = (select COUNT(*) from @Tmp);
 
 SELECT A.frase from
 (
 select M.f1 as [frase], T.f1 as [word] 
 from @MyTable M INNER JOIN @Tmp T ON M.f1 LIKE '%' + T.f1 + '%'
 ) A
 GROUP BY A.frase
 HAVING COUNT(*) = @cnt
15 дек 15, 16:52    [18563853]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
Konst_One,

спасибо всем за подсказки.
15 дек 15, 16:58    [18563877]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать SELECT запрос  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1203
Mandarin,

как говорится "а ларчик то просто открывался", вот что нужно было QUOTENAME
15 дек 15, 17:25    [18563999]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить