Поиск значения по любому столбцу

Previous  Top  Next

    
 

 

 

Частенько встречается следующая ситуация. Вы работате с базой данных, в

которой множество таблиц. К концу рабочего дня голова идёт кругом от

названий столбцов, ...

Ещё ситуация: вы знаете, что где то в таблице должно было появиться опреде-

лённое число (с помощью клиентской программы ввели, например, год своего рождения,

но не желаете разбираться в таблице 200*150000, в какое именно поле и в какой строке

оно оказалось записано...

Или вам просто лень...

В общем - лень - двигатель прогресса.

Сформулируем задачу: можно ли выбрать из таблицы все записи в которых встречается

определённое значение поля в любом из столбцов?

Можно!

Именно для этого я и написал приблуду, которую и хочу представить вашему вниманию.

Надеюсь, что код достаточно хорошо прокомментирован.

 

Code:

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. Сначала думал, что сам неправильно пишу, но оказалось, что

это глюк БД, при чём глюк - не от немецкого слова счастье, а от русского слова несчастье.

Оказалось - очень полезная штука! Надеюсь, и вам пригодится.

 

Автор AQL

©Drkb::02791

Взято из http://forum.sources.ru