С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/88: Рейтинг темы: голосов - 88, средняя оценка - 4.76
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1

Поиск слова по всей базе данных

10.07.2020, 11:57. Показов 17952. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хорошего дня всем!

Сначала немного вводной информации. Есть приложение, написанное мной на VB.Net, которое работает с базой данных (пока это файл-access, но в дальнейшем можно будет подключиться к любому поддерживаемому программой источнику). Работа с базой построена на выполнении SQL-запросов. Захотелось реализовать контекстный поиск по всей базе. Начал гуглить (яндексить), нагуглил вот такую статейку MySQL. Поиск строки по всей базе. Так как я в SQL прямо скажу "не очень", то понял только следующее: автор для реализации поиска написал хранимую процедуру, поиск находит первое вхождение искомой строки и возвращает результат поиска в каком-то информационном виде.

А теперь вопрос: как правильно организовать поиск текста по всем таблицам базы?
Понятно, что вопрос очень общий, но тем не менее. Что требуется: поиск должен осуществляться по всем таблицам базы, причём индексные поля должны опускаться (а то поиск числа вернёт не верный результат); поиск должен возвращать информацию вида имя_таблицы - индекс строки; поиск должен возвращать все результаты совпадения, а не первое обнаруженное значение.

Буду благодарен за любую помощь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.07.2020, 11:57
Ответы с готовыми решениями:

Поиск по всей базе
Здравствуйте! Есть БД, в которой имеется множество таблиц. Я знаю, что в колонке Name одной из этих таблиц есть значение, скажем...

Поиск по всей базе
Подскажите, можно ли сделать поиск значения по всей базе? Например мне в базе нужно найти номер телефона,а таблиц несколько сотен ??

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

11
5958 / 4534 / 1094
Регистрация: 29.08.2013
Сообщений: 28,139
Записей в блоге: 3
10.07.2020, 15:36
задача очень бредовая так как поиск в неиндексируемом поле займет у вас кучу времени

но почему нет - перебирайте список таблиц и ищите

доставляет такая мечта
Цитата Сообщение от Uswer Посмотреть сообщение
которое работает с базой данных (пока это файл-access
Цитата Сообщение от Uswer Посмотреть сообщение
но в дальнейшем можно будет подключиться к любому поддерживаемому программой источнику
вы понимаете что SQL для каждой СУБД разный?

Цитата Сообщение от Uswer Посмотреть сообщение
поиск должен возвращать все результаты совпадения, а не первое обнаруженное значение.
вы попробуйте запросом найти значение в базе, вам вернется первое или все?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.07.2020, 15:46
Цитата Сообщение от Uswer Посмотреть сообщение
Захотелось реализовать контекстный поиск по всей базе.
В подавляющем большинстве случаев, возникновение такого желания говорит о неверно спроектированной БД.
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
10.07.2020, 20:12  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
возникновение такого желания говорит о неверно спроектированной БД
Вот тут ох как несогласен. Смотрите, у меня в базе несколько таблиц. В одной Пользователи (поля: ID, Фамилия, Имя, Отчество, отдел, должность и др.), в другой Отделы (поля: ID, Название), в третьей Должности (поля: ID, Название). Понятно, что в первой поля Отдел и Должность ссылочные на другие таблицы. И что по Вашему поиск слова должен затрагивать только одну какую-то таблицу - бред. Нормальный поисковый запрос должен вернуть совпадения из всех (в данном примере трёх) таблиц.

Добавлено через 35 минут
Цитата Сообщение от qwertehok Посмотреть сообщение
вы понимаете что SQL для каждой СУБД разный?
Отлично понимаю, поэтому все SQL-запросы в моей программе максимально стандартизированы и упрощены. Так как в VB.Net есть такая штука как Фабрика, то её применение позволяет абстрагироваться от конкретного источника (СУБД) и выполнять запросы единообразно. Понимая, что в разных СУБД синтаксис может отличаться я и строю свою программу с использованием общих (одинаковых для разных СУБД) SQL-команд.
Продолжая тему уникальности каждой СУБД я вижу только один вариант для решения моей (на самом деле не только моей) задачи, это создание хранимой процедуры и её вызов из программы. Такая процедура запросто может вернуть набор данных.
Цитата Сообщение от qwertehok Посмотреть сообщение
вы попробуйте запросом найти значение в базе, вам вернется первое или все?
В этом и проблема, что составить сложный запрос я сам не умею, поэтому и задал вопрос на форуме.

qwertehok, Вы код в приведённой мной ссылке смотрели? Там реализован просмотр всех таблиц БД.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.07.2020, 20:21
Цитата Сообщение от Uswer Посмотреть сообщение
Нормальный поисковый запрос должен вернуть совпадения из всех (в данном примере трёх) таблиц.
Т.е. ищущий понятия не имеет, а что же он хочет найти - имя, фамилию, отдел или должность? И занимается поиском из праздного любопытства?
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
10.07.2020, 20:32  [ТС]
invm, а почему бы и нет. Вы когда на этом форуме пользуетесь поиском выбираете где именно искать? Конечно, в расширенном варианте поиска есть дополнительные параметры поиска, но в базовом-то этого нет и он "шуршит" везде, где только можно, а форум этот тоже БД!
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.07.2020, 20:56
Uswer, а вы на форуме ищете что-то в конкретном разделе (разделах), или предпочитаете получить 100500 страниц результатов глобальным поиском и до посинения искать среди них глазами нужную инфу?

По теме: гуглите по "sql server search data in all tables". Вариантов будет много разных.
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
10.07.2020, 21:51  [ТС]
invm, по поводу первого - я думаю что пользователь не должен вникать в структуру данных, ибо на то он и поиск, что изначально не совсем понятно что мы ищем.
Цитата Сообщение от invm Посмотреть сообщение
получить 100500 страниц
Грешен, бывает пользуюсь глобальным поиском на форуме и он зараза находит то, что нужно.

invm, по второй части ответа совсем печалька , попахивает нарушением п.3.3 правил форума. Я же писал в самом начале, что гуглить пробовал и нашёл массу инфы. Вот только конкретного решения не получил, везде одни обрывки кода под конкретные БД.

Уважаемый invm, давайте не будем раздувать тему выяснением почему так, ответ краток "я так хочу". Просто помогите кодом, начнём с малого - закончим, ну чем закончим!
0
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
11.07.2020, 10:19
Uswer,
Цитата Сообщение от Uswer Посмотреть сообщение
Вы когда на этом форуме пользуетесь поиском выбираете где именно искать? Конечно, в расширенном варианте поиска есть дополнительные параметры поиска, но в базовом-то этого нет и он "шуршит" везде, где только можно, а форум этот тоже БД!
вот именно, что интерфейс форума наполняется из БД, и поиск ведется в БД, и для каждого объекта, я уверен на 100% (так как форум создавали не глупые люди), создана своя модель данных, а именно: текст шапки темы - в одном поле в таблице-справочнике, вопросы и комментарии в разных таблицах, но связанных ключами с таблицей, где хранятся тесты тем.
это обычная логика хранения данных в бд. и никак тут не происходит поиск чего-то невнятного по всей БД, а как раз таки наоборот.
Цитата Сообщение от Uswer Посмотреть сообщение
Вот только конкретного решения не получил, везде одни обрывки кода под конкретные БД.
получается, ты в ветке про MSSQL ищешь оптимальное решение, которое подойдет под любой сервер? ну это конечно сильно.
Цитата Сообщение от Uswer Посмотреть сообщение
ответ краток "я так хочу"
не раз сталкивался с тем, что такое желание возникает поперек здравому смыслу и обычному подходу в разработке.
вот запрос для поиск значения для MSSQL, предусмотрен тип полей, в котором ты будешь искать значение.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
DECLARE @s VARCHAR(10),@SQL VARCHAR(MAX)
SET @s = '2508995'
DECLARE c CURSOR FOR
    SELECT
        'select * from ' + t + ' where '
        + LEFT(f,len(f)-2)
    FROM(
        SELECT
            '['+TABLE_SCHEMA+'].['+TABLE_NAME +']' t
            ,(
            SELECT
           '['+c.COLUMN_NAME+'] like ''%'+@s+'%'' or '
               
            FROM
                INFORMATION_SCHEMA.COLUMNS c
            WHERE
                c.DATA_TYPE IN ('varchar','nvarchar','int')
                AND t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
            FOR XML PATH('')
            ) f
        FROM
            INFORMATION_SCHEMA.TABLES t
        ) v
    WHERE
        f IS NOT NULL
OPEN c
FETCH NEXT FROM c INTO @SQL
WHILE @@FETCH_STATUS = 0 BEGIN
    PRINT @SQL
    --exec(@sql)
    --exec('if exists('+@sql+') ' + @sql)
    FETCH NEXT FROM c INTO @SQL
END
CLOSE c
DEALLOCATE c
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
11.07.2020, 11:29  [ТС]
AndreyVorobey, спасибо за код, пошёл курить интернет чтобы всё это хотя бы понять.

AndreyVorobey, не очень люблю спорить, но сдержаться не могу. Вот Ваши слова:
Цитата Сообщение от AndreyVorobey Посмотреть сообщение
текст шапки темы - в одном поле в таблице-справочнике, вопросы и комментарии в разных таблицах, но связанных ключами с таблицей, где хранятся тесты тем
Что мы видим из фразы, а видим как минимум несколько таблиц в БД, но поиск по сайту обрабатывает их все. И чем это отличается от того, что требуется мне? В моём варианте просто не указываются конкретные таблицы, а участвуют в поиске все таблицы БД (кстати, их там пока не миллион). Очень возможно, что как только я разберусь с представленным кодом, попробую его изменить для обработки лишь некоторых таблиц, но это далеко идущие планы.

Всем, ребята я прекрасно понимаю, что тема в разделе SQL звучит как желание "поперек здравому смыслу", но попробуйте посмотреть на проблему моими глазами. У меня БД строилась под конкретные нужды и для решения основной задачи была спроектирована (слово-то какое) именно так как есть. Понятное дело, если бы я петрил в СУБД и в том, чем я занимаюсь по долгу службы, одинаково, то и БД была бы построена иначе, но в СУБД я нуб или так "неопытный пользователь". Однако БД уже используется и хранит данные и есть сильное желание расширить функционал программы контекстным поиском. Я без проблем мог бы реализовать поиск на уровне приложения, но это опять же противоречит здравому смыслу, т.к. в этом случае на уровне приложения придётся читать всю БД, а это, сами понимаете, не айс, особенно при многопользовательском доступе.
0
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
11.07.2020, 12:09
Uswer,
Цитата Сообщение от Uswer Посмотреть сообщение
Что мы видим из фразы, а видим как минимум несколько таблиц в БД, но поиск по сайту обрабатывает их все.
такое ощущение, что ты знаком с SQL пару дней.
да, участвуют несколько таблиц, но это не значит, что при поиске проверяется каждое поле каждой таблицы, а то, что все эти таблицы связаны друг с другом ключевыми полями через JOIN, где установлено условие WHERE (грубо говоря - вывести пару полей из таблиц тема, вопрос, комментарий where поле из таблицы комментарий содержит текст который ввели в поле поиске) все, а дальше формируется datatable, который разбрасывает по интерфейсы в нужные места результат, но здесь уже sql никаким боком.
не нужно каверкать мои слова.
Цитата Сообщение от Uswer Посмотреть сообщение
В моём варианте просто не указываются конкретные таблицы, а участвуют в поиске все таблицы БД
твой вариант хоть и имеет место на существование, но противоречит принципам построения БД.
из самого определения четко видно
База данных (БД) — это организованная структура, предназначенная для хранения информации. Обычно БД представляются в виде совокупности взаимосвязанных файлов или таблиц, предназначенных для решения конкретной задачи.
что означает, получение этих данных строится все на тех же связях.
а ты хочешь ввести в поле любое значение, и запрос начнет искать по всем полям всех таблиц (вопрос про то, что типов данных множество, отпадает, так как запрос предусматривает поиск только определенных типов данных. потому что поиск по слову "авокадо" вылетит с ошибкой, как только дойдет до перебора поля "дата")
а когда таблиц станет большое количество, и когда данные начнут совпадать по значению, но не по смысловой нагрузке, тогда что?
а если ты хочешь делать это
Цитата Сообщение от Uswer Посмотреть сообщение
попробую его изменить для обработки лишь некоторых таблиц
то для чего эта тема вообще создавалась? напиши ряд запросов, которые будут формировать свои выборки исходя из условия, и вызывай эти запросы при взаимодействии с тем или иным элементом интерфейса.
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
11.07.2020, 21:27  [ТС]
Цитата Сообщение от AndreyVorobey Посмотреть сообщение
такое ощущение, что ты знаком с SQL пару дней
Пардон, а когда я говорил, что я дока в этом вопросе, как раз наоборот.

Цитата Сообщение от AndreyVorobey Посмотреть сообщение
напиши ряд запросов, которые будут формировать свои выборки исходя из условия, и вызывай эти запросы при взаимодействии с тем или иным элементом интерфейса
Скорее всего так и сделаю. Это была первая мысль о реализации поиска. Просто я хотел часть нагрузки снять с клиента, а нагрузить сервер БД при помощи хранимой процедуры.

Цитата Сообщение от AndreyVorobey Посмотреть сообщение
поиск по слову "авокадо" вылетит с ошибкой, как только дойдет до перебора поля "дата"
В коде по приведённой ссылке автор понимая это сделал обработку полей только нужных типов, так что ... (не хочу ругаться и обижать кого-то).

Цитата Сообщение от AndreyVorobey Посмотреть сообщение
связаны друг с другом ключевыми полями через JOIN ... условие WHERE ... но здесь уже sql никаким боком
Всё приехали, сливай воду! А что такое JOIN и WHERE? Разве это не инструкции макроязыка SQL? Или для Вас SQL это "целый мир", а какой-то Where так пустяк?

Считаю тему исчерпанной (хотя при здравом подходе есть о чём поговорить), предлагаю далее не вступать в перепалку. Основной посыл завсегдатаев Microsoft SQL Server мне ясен. Я признаю свою безграмотность в этом вопросе, у всех прошу прощения за отнятое время, всем хорошего настроения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.07.2020, 21:27
Помогаю со студенческими работами здесь

Поиск значения поля по всей базе
Добрый день! учусь работать с Oracle 11 Малознакомая мне БД, 600 таблиц, мне необходимо найти поле и его значение по всей базе, ...

Не получается сделать поиск по всей базе данных
Здравствуйте, у меня был реализован поиск по всей базе данных. Стоит edit и когда в него вводится информация то он ищет. Код такой: ...

Поиск в базе данных по части слова - вывод в датагрид
Здравствуйте. Возникла проблема с поиском по части слова в конкретном столбце таблицы, а точнее с его выводом. Имеется таблица clients...

Поиск в базе и перенос всей таблицы
Не могу реализовать запрос, который бы искал в определенном столбце данные и переносил всю строку с переменные. Натолкните на мысль...

Поиск известного изменения столбца и его изменение по всей базе
Всем привет! Друзья, нужна ваша помощь. К сожалению по форуму не нашел, но если вдруг была тема, прошу меня простить) В общем, есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru