[на редактирование] Поиск в таблице определённого значения
    
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
    информация о разделе
  ![]()  | Данный раздел не предназначается для обсуждения, здесь собираются только вопросы-ответы по тематике баз данных. Если есть желание обсудить какие-то вопросы, связанные с тематикой баз данных - перейдите в соответствующие разделы "Базы данных: общие вопросы" или "Базы данных: SQL". | 
    [на редактирование] Поиск в таблице определённого значения
    
  | 
         
         
         
          
           Сообщ.
           #1
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Частенько встречается следующая ситуация. Вы работате с базой данных, в  
        
      которой множество таблиц. К концу рабочего дня голова идёт кругом от названий столбцов, ... Ещё ситуация: вы знаете, что где то в таблице должно было появиться опреде- лённое число (с помощью клиентской программы ввели, например, год своего рождения, но не желаете разбираться в таблице 200*150000, в какое именно поле и в какой строке оно оказалось записано... Или вам просто лень... В общем - лень - двигатель прогресса. Сформулируем задачу: можно ли выбрать из таблицы все записи в которых встречается определённое значение поля в любом из столбцов? Можно! Именно для этого я и написал приблуду, которую и хочу представить вашему вниманию. Надеюсь, что код достаточно хорошо прокомментирован. ![]() ![]() 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. Сначала думал, что сам неправильно пишу, но оказалось, что это глюк БД, при чём глюк - не от немецкого слова счастье, а от русского слова несчастье. Оказалось - очень полезная штука! Надеюсь, и вам пригодится.  |