На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел не предназначается для обсуждения, здесь собираются только вопросы-ответы по тематике баз данных. Если есть желание обсудить какие-то вопросы, связанные с тематикой баз данных - перейдите в соответствующие разделы "Базы данных: общие вопросы" или "Базы данных: SQL".
Модераторы: Bas, Chow, MIF
  
    > [на редактирование] Поиск в таблице определённого значения
      Частенько встречается следующая ситуация. Вы работате с базой данных, в
      которой множество таблиц. К концу рабочего дня голова идёт кругом от
      названий столбцов, ...
      Ещё ситуация: вы знаете, что где то в таблице должно было появиться опреде-
      лённое число (с помощью клиентской программы ввели, например, год своего рождения,
      но не желаете разбираться в таблице 200*150000, в какое именно поле и в какой строке
      оно оказалось записано...
      Или вам просто лень...
      В общем - лень - двигатель прогресса.
      Сформулируем задачу: можно ли выбрать из таблицы все записи в которых встречается
      определённое значение поля в любом из столбцов?
      Можно!
      Именно для этого я и написал приблуду, которую и хочу представить вашему вниманию.
      Надеюсь, что код достаточно хорошо прокомментирован.

      ExpandedWrap disabled
         
        declare
        @sColumnName   varchar(30),
        @sQuery        varchar(200),
        @sTempQuery    varchar(200),
        @sTabname      varchar(30),
        @nSearchParam  int
         
        ----установим рабочие переменные:
        SELECT @sTabname      = 'relTable'     ----имя таблицы, из которой будем производить выборку
        SELECT @nSearchParam  = 9348           ----искомое значение, в данном случае - неккий id.
         
         
         
        ----все имена колонок нашей БД хранятся в таблице syscolumns, все объекты: в таблице sysobjects
        ----эти две таблицы мы свяжем по полю id, следующим заполним временную таблицу #cname,
        ----в которой будут храниться имена всех столбцов интересующей нас таблицы
         
        SELECT c.name INTO #cname
          FROM syscolumns c, sysobjects o
          WHERE c.id = o.id
          AND c.xtype = 56
          AND o.xtype = 'U'
          AND c.type = 38
          AND o.name = @sTabname
         
         
        ---Примечание:
        ---c.xtype = 56    - означает, что нас интересуют только поля таблиц
        ---c.type  = 38    - означает, что нас интересуют числовые поля
         
         
        SELECT @sColumnName = ''          --начальная инициализация - на всякий пожарный
         
         
        WHILE 1 = 1                  
        BEGIN
          SET rowcount 1                  --данные из таблицы будем выбирать по одной строке
          SELECT @sColumnName = name      --получили имя
            FROM  #cname  
            WHERE name > @sName           --следующей колонки
            ORDER BY  name                --обязательно отсортировать по полю, которое выбираем!
         
         
         
          IF @@rowcount = 0               --если дошли до конца временно таблицы
          BEGIN
            SET rowcount 0          
            BREAK                         --завершим цикл
          END
         
          SET rowcount 0            
         
            
         
          --используем динамическое создание SQL запроса
          SELECT @sTempQuery = ' WHERE ' + @sColumnName + '= ' + Str(@nSearchParam)    
          SELECT @sQuery = 'IF EXIST (SELECT 1 FROM ' + @sTabname + @sTempQuery + ') BEGIN ' +
                           ' SELECT ' + @sColumnName + ',* FROM ' + @sTabname + @sTempQuery + ' END'    
         
            
          --исполним его
          EXEC (@sQuery)
         
          --такие сложности с EXIST нам нужны для того, что бы QueryAnalyzer не мучал нас выводом пустых
          --результатов запроса
        END
        DROP TABLE #cname    ---уничтожим временную таблицу


      Что то похожее можно написать для поиска строкового параметра, я думаю, Вы и сами
      справитесь с этой простой задачей. Аналогично, для диапазонов значений, и т.д.
      Остаётся лишь подправить по своему вкусу запрос @sTempQuery.
      Успехов

      P.S. Вчера, пока писал эту приблуду, обнаружил небольшую брешь в БД. А именно - недостаток
      записей с определёнными id. Сначала думал, что сам неправильно пишу, но оказалось, что
      это глюк БД, при чём глюк - не от немецкого слова счастье, а от русского слова несчастье.
      Оказалось - очень полезная штука! Надеюсь, и вам пригодится.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0222 ]   [ 16 queries used ]   [ Generated: 28.03.24, 14:33 GMT ]