Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Базы данных FAQ > [на редактирование] Поиск в таблице определённого значения


Автор: AQL 21.10.04, 13:36
Частенько встречается следующая ситуация. Вы работате с базой данных, в
которой множество таблиц. К концу рабочего дня голова идёт кругом от
названий столбцов, ...
Ещё ситуация: вы знаете, что где то в таблице должно было появиться опреде-
лённое число (с помощью клиентской программы ввели, например, год своего рождения,
но не желаете разбираться в таблице 200*150000, в какое именно поле и в какой строке
оно оказалось записано...
Или вам просто лень...
В общем - лень - двигатель прогресса.
Сформулируем задачу: можно ли выбрать из таблицы все записи в которых встречается
определённое значение поля в любом из столбцов?
Можно!
Именно для этого я и написал приблуду, которую и хочу представить вашему вниманию.
Надеюсь, что код достаточно хорошо прокомментирован.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    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. Сначала думал, что сам неправильно пишу, но оказалось, что
это глюк БД, при чём глюк - не от немецкого слова счастье, а от русского слова несчастье.
Оказалось - очень полезная штука! Надеюсь, и вам пригодится.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)