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

Частенько встречается следующая ситуация. Вы работате с базой данных, в
которой множество таблиц. К концу рабочего дня голова идёт кругом от
названий столбцов, ...
Ещё ситуация: вы знаете, что где то в таблице должно было появиться опреде-
лённое число (с помощью клиентской программы ввели, например, год своего рождения,
но не желаете разбираться в таблице 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. Сначала думал, что сам неправильно пишу, но оказалось, что
это глюк БД, при чём глюк - не от немецкого слова счастье, а от русского слова несчастье.
Оказалось - очень полезная штука! Надеюсь, и вам пригодится.
Автор AQL
Взято из http://forum.sources.ru

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...