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

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