<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=69955&amp;view=findpost&amp;p=489159</guid>
        <pubDate>Thu, 21 Oct 2004 13:36:04 +0000</pubDate>
        <title>[на редактирование] Поиск в таблице определённого значения</title>
        <link>https://forum.sources.ru/index.php?showtopic=69955&amp;view=findpost&amp;p=489159</link>
        <description><![CDATA[AQL: Частенько встречается следующая ситуация. Вы работате с базой данных, в <br>
которой множество таблиц. К концу рабочего дня голова идёт кругом от<br>
названий столбцов, ...<br>
Ещё ситуация: вы знаете, что где то в таблице должно было появиться опреде-<br>
лённое число (с помощью клиентской программы ввели, например, год своего рождения,<br>
но не желаете разбираться в таблице 200*150000, в какое именно поле и в какой строке<br>
оно оказалось записано...<br>
Или вам просто лень...<br>
В общем - лень - двигатель прогресса.<br>
Сформулируем задачу: можно ли выбрать из таблицы все записи в которых встречается<br>
определённое значение поля в любом из столбцов?<br>
Можно&#33;<br>
Именно для этого я и написал приблуду, которую и хочу представить вашему вниманию.<br>
Надеюсь, что код достаточно хорошо прокомментирован.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">declare</div><div class="code_line">@sColumnName &nbsp; varchar(30),</div><div class="code_line">@sQuery &nbsp; &nbsp; &nbsp; &nbsp;varchar(200),</div><div class="code_line">@sTempQuery &nbsp; &nbsp;varchar(200),</div><div class="code_line">@sTabname &nbsp; &nbsp; &nbsp;varchar(30),</div><div class="code_line">@nSearchParam &nbsp;int</div><div class="code_line">&nbsp;</div><div class="code_line">----установим рабочие переменные:</div><div class="code_line">SELECT @sTabname &nbsp; &nbsp; &nbsp;= &#39;relTable&#39; &nbsp; &nbsp; ----имя таблицы, из которой будем производить выборку</div><div class="code_line">SELECT @nSearchParam &nbsp;= 9348 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----искомое значение, в данном случае - неккий id.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">----все имена колонок нашей БД хранятся в таблице syscolumns, все объекты: в таблице sysobjects</div><div class="code_line">----эти две таблицы мы свяжем по полю id, следующим заполним временную таблицу #cname, </div><div class="code_line">----в которой будут храниться имена всех столбцов интересующей нас таблицы</div><div class="code_line">&nbsp;</div><div class="code_line">SELECT c.name INTO #cname </div><div class="code_line">&nbsp;&nbsp;FROM syscolumns c, sysobjects o </div><div class="code_line">&nbsp;&nbsp;WHERE c.id = o.id </div><div class="code_line">&nbsp;&nbsp;AND c.xtype = 56 </div><div class="code_line">&nbsp;&nbsp;AND o.xtype = &#39;U&#39; </div><div class="code_line">&nbsp;&nbsp;AND c.type = 38 </div><div class="code_line">&nbsp;&nbsp;AND o.name = @sTabname</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">---Примечание:</div><div class="code_line">---c.xtype = 56 &nbsp; &nbsp;- означает, что нас интересуют только поля таблиц</div><div class="code_line">---c.type &nbsp;= 38 &nbsp; &nbsp;- означает, что нас интересуют числовые поля</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">SELECT @sColumnName = &#39;&#39; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;--начальная инициализация - на всякий пожарный</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">WHILE 1 = 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;SET rowcount 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;--данные из таблицы будем выбирать по одной строке</div><div class="code_line">&nbsp;&nbsp;SELECT @sColumnName = name &nbsp; &nbsp; &nbsp;--получили имя </div><div class="code_line">&nbsp;&nbsp; &nbsp;FROM &nbsp;#cname &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WHERE name &#62; @sName &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --следующей колонки</div><div class="code_line">&nbsp;&nbsp; &nbsp;ORDER BY &nbsp;name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;--обязательно отсортировать по полю, которое выбираем!</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;IF @@rowcount = 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --если дошли до конца временно таблицы</div><div class="code_line">&nbsp;&nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp;SET rowcount 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;BREAK &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --завершим цикл</div><div class="code_line">&nbsp;&nbsp;END</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SET rowcount 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;--используем динамическое создание SQL запроса</div><div class="code_line">&nbsp;&nbsp;SELECT @sTempQuery = &#39; WHERE &#39; + @sColumnName + &#39;= &#39; + Str(@nSearchParam) &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;SELECT @sQuery = &#39;IF EXIST (SELECT 1 FROM &#39; + @sTabname + @sTempQuery + &#39;) BEGIN &#39; +</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39; SELECT &#39; + @sColumnName + &#39;,* FROM &#39; + @sTabname + @sTempQuery + &#39; END&#39; &nbsp; &nbsp; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp;--исполним его</div><div class="code_line">&nbsp;&nbsp;EXEC (@sQuery)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;--такие сложности с EXIST нам нужны для того, что бы QueryAnalyzer не мучал нас выводом пустых </div><div class="code_line">&nbsp;&nbsp;--результатов запроса</div><div class="code_line">END</div><div class="code_line">DROP TABLE #cname &nbsp; &nbsp;---уничтожим временную таблицу</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Что то похожее можно написать для поиска строкового параметра, я думаю, Вы и сами<br>
справитесь с этой простой задачей. Аналогично, для диапазонов значений, и т.д.<br>
Остаётся лишь подправить по своему вкусу запрос @sTempQuery.<br>
Успехов<br>
<br>
P.S. Вчера, пока писал эту приблуду, обнаружил небольшую брешь в БД. А именно - недостаток<br>
записей с определёнными id. Сначала думал, что сам неправильно пишу, но оказалось, что <br>
это глюк БД, при чём глюк - не от немецкого слова счастье, а от русского слова несчастье.<br>
Оказалось - очень полезная штука&#33; Надеюсь, и вам пригодится.]]></description>
        <author>AQL</author>
        <category>Базы данных FAQ</category>
      </item>
	
      </channel>
      </rss>
	