<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7309184816634381248</id><updated>2024-10-07T09:47:01.760+03:00</updated><category term="SQL"/><category term="SqlIntro"/><category term="ASP.NET"/><category term="DML"/><category term="Visual Studio"/><category term="MVC"/><category term="Entity Framework"/><category term="Scaffolding"/><category term="Code"/><category term="ETL"/><category term="MyBlog"/><category term="Razor"/><category term="Refactoring"/><category term="SqlTricks"/><category term="WebMatrix"/><category term="Workspace"/><category term="Cloud"/><category term="DDL"/><category term="InsideSQL"/><category term="NuGet"/><category term="Security"/><category term="YarFullStack"/><title type='text'>О разработке ПО и эффективности</title><subtitle type='html'>Методы и инструменты эффективной разработки приложений.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-3675793201693576456</id><published>2019-02-08T23:38:00.001+03:00</published><updated>2019-02-08T23:40:07.355+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MyBlog"/><category scheme="http://www.blogger.com/atom/ns#" term="YarFullStack"/><title type='text'>Про судьбу этого блога и YarFullStack</title><content type='html'>&lt;p&gt;Внимательные читатели наверняка заметили, что я давно сюда не писал :)&lt;/p&gt;
&lt;p&gt;Дело в том, что пару лет назад я начал писать немного в другом формате в другой блог - &lt;a href=&quot;https://yarfullstack.com/post/about/&quot; target=&quot;_blank&quot;&gt;YarFullStack&lt;/a&gt;.
Основное отличие в том, что там более короткие и менее &quot;образовательные&quot; сообщения на более широкие темы. А ещё - я полностью управляю его дизайном и наличием (то есть, отсутствием) рекламы, аналитики и т.п.&lt;/p&gt;

&lt;p&gt;Это &quot;переформатирование&quot; мне понравилось. А ещё 2016 год стал для меня временем многих перемен. Что, конечно, не извиняет меня за отсутствие всех этих пояснений здесь два года назад. Исправляюсь.&lt;/p&gt;

&lt;p&gt;Буду ли я писать сюда что-то новое? В ближайшее время - вряд ли. Скорее всего, буду делать краткие дайджесты из нескольких статей с &lt;a href=&quot;https://yarfullstack.com/&quot; target=&quot;_blank&quot;&gt;YarFullStack&lt;/a&gt;. 
Так что, если хотите - читайте их здесь. А можете подписаться на &lt;a href=&quot;https://twitter.com/YarFS&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Twitter&lt;/a&gt; или &lt;a href=&quot;https://t.me/yarfullstack&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Telegram&lt;/a&gt; нового проекта, чтобы получать их оперативнее.
&lt;/p&gt;

&lt;p&gt;P.S. Единственное, что может вам показаться непривычным на новом сайте - отсутствие комментариев. Раньше там был disqus, но он тормозной и бесящий. Поэтому пока единственный вариант комментариев - в твиттере. Или здесь :)&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/3675793201693576456/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2019/02/yarfullstack.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/3675793201693576456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/3675793201693576456'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2019/02/yarfullstack.html' title='Про судьбу этого блога и YarFullStack'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-4673470962708416043</id><published>2014-12-03T00:07:00.001+03:00</published><updated>2014-12-03T00:10:56.093+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SqlIntro"/><title type='text'>MSSQL – простые индикаторы нехватки индексов</title><content type='html'>&lt;p&gt;Как обычно в нашей профессии, есть несколько способов решить задачу :)&lt;/p&gt; &lt;p&gt;Расскажу о трёх наиболее простых подходах (и одном бонусном), не углубляясь в детали. Если интересны как раз глубокие детали, рекомендую почитать документацию (начать стоит с &lt;a href=&quot;http://technet.microsoft.com/en-us/library/ms190804(v=sql.105).aspx&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Designing Indexes&lt;/a&gt;, а прочитав о проектировании продолжить &lt;a href=&quot;http://technet.microsoft.com/en-us/library/bb510669(v=sql.105).aspx&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Performance (Database Engine)&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Кстати, если тема плана выполнения для вас нова – неплохим стартом будет мой давний пост «&lt;a href=&quot;http://www.olegaxenow.com/2011/04/sql-execution-plan.html&quot; target=&quot;_blank&quot;&gt;SQL – execution plan&lt;/a&gt;».&lt;/p&gt; &lt;p&gt;&lt;strong&gt;DISCLAIMER&lt;/strong&gt;: в этой статье я даю простые советы, которые чаще всего работают, однако в MSSQL практически невозможно дать рекомендации на все случаи жизни – данные бывают разные, запросы бывают разные…&lt;/p&gt; &lt;h2&gt;1. Мысленный эксперимент&lt;/h2&gt; &lt;p&gt;Достаточно полезный способ, особенно на этапе проектирования. Хорошим подспорьем для тех, кому индексы в новинку, будет вышеупомянутый раздел про дизайн индексов.&lt;/p&gt; &lt;p&gt;Что касается простейших советов, они следующие:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Если данных не мизерное количество – вам нужны индексы.  &lt;li&gt;Если есть внешние ключи – настоящие или по смыслу (некоторые их принципиально не любят делать) – они хорошие кандидаты для индексирования.  &lt;li&gt;Чаще всего стоит сделать кластерный индекс и сделать его не слишком большим (потому что другие индексы будут ссылаться на строки по кластерному индексу). Кстати, кластерный индекс отлично подходит для выборки по диапазону (например, по диапазону дат).  &lt;li&gt;Помните, что индексы тоже хранятся на диске. Простейший вывод – большое количество индексов снизит скорость вставки (иногда и обновления) данных. Обычно до создания 5-7 индексов проблем не возникает.  &lt;li&gt;Статистика очень важна для правильного использования индексов. Хорошая новость – чаще всего MSSQL сам достаточно неплохо за ней следит, плохая новость – это не всегда срабатывает.  &lt;li&gt;Для наиболее критичных запросов, возвращающих небольшое количество столбцов, имеет смысл использовать покрытие индексом (это уже чуть более продвинутая техника, но ничего сложного в ней нет).&lt;/li&gt; &lt;p&gt;Поскольку я обещал не углубляться в детали – идём дальше.&lt;/p&gt; &lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a href=&quot;http://www.olegaxenow.com/2014/12/mssql-prostye-indikatory-nehvatki.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/4673470962708416043/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2014/12/mssql-prostye-indikatory-nehvatki.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/4673470962708416043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/4673470962708416043'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2014/12/mssql-prostye-indikatory-nehvatki.html' title='MSSQL – простые индикаторы нехватки индексов'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-6443356231036906558</id><published>2014-01-21T23:06:00.001+04:00</published><updated>2014-01-21T23:08:54.555+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ETL"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>Практическое применение Integration Services</title><content type='html'>&lt;p&gt;Изложение не претендует на полноту, сейчас я хочу показать лишь некоторые возможности SSIS, чтобы вы могли приблизительность оценить целесообразность его использования. А уже в случае такого выбора - изучать предмет более досконально.&lt;/p&gt; &lt;h2&gt;1. Базы данных для примера&lt;/h2&gt; &lt;p&gt;В примерах используется база данных &lt;a href=&quot;http://msftdbprodsamples.codeplex.com/releases/view/55330&quot; rel=&quot;nofollow&quot;&gt;AdventureWorks&lt;/a&gt; в качестве источника и простая база, которую легко можно сделать самостоятельно в качестве приёмника данных. Важно понимать, что примеры приводятся искусственные, в реальной жизни всё может быть несколько сложнее.&lt;/p&gt; &lt;p&gt;Итак, перед началом работы нам понадобится экземпляр MS SQL Server 2012 с установленной на нём БД &lt;a href=&quot;http://msftdbprodsamples.codeplex.com/releases/view/55330&quot; rel=&quot;nofollow&quot;&gt;AdventureWorks&lt;/a&gt; и созданной тестовой БД, назовём её TestSSIS. Для обучения проще держать MS SQL на том же компьютере, на котором будем работать с проектом Integration Services.&lt;/p&gt; &lt;a href=&quot;http://www.olegaxenow.com/2014/01/prakticheskoe-primenenie-integration.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/6443356231036906558/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2014/01/prakticheskoe-primenenie-integration.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6443356231036906558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6443356231036906558'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2014/01/prakticheskoe-primenenie-integration.html' title='Практическое применение Integration Services'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-UtOHv2I2uo0/Ut7EpLdObTI/AAAAAAAAAiM/ExKKbNuKeow/s72-c/00.InstallSql_thumb2.png?imgmax=800" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-8091780659951674152</id><published>2014-01-21T23:02:00.001+04:00</published><updated>2014-01-21T23:03:05.944+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ETL"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>Распространённые технологии импорта данных</title><content type='html'>&lt;p&gt;Под распространёнными технологиями подразумеваются те, которые часто используются для импорта данных. Разумеется, для некоторых задач чаще могут использоваться технологии импорта, которые не вошли в список ниже.&lt;/p&gt; &lt;h2&gt;1. BULK INSERT/bcp&lt;/h2&gt; &lt;p&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/ms162802.aspx&quot; rel=&quot;nofollow&quot;&gt;bcp&lt;/a&gt; - это утилита командной строки для импорта/экспорта данных, входящая в состав Microsoft SQL Server 2012 tools (для более ранних версий она тоже присутствует). &lt;a href=&quot;http://technet.microsoft.com/en-us/library/ms188365.aspx&quot; rel=&quot;nofollow&quot;&gt;BULK INSERT&lt;/a&gt; - команда T-SQL, позволяющая импортировать данные тем же способом что и bcp, но без использования командной строки.&lt;/p&gt; &lt;p&gt;Основное назначение bcp - быстрое копирование данных между аналогичными по структуре таблицами. В принципе, с помощью файла формата (указанного в качестве опции) можно копировать данные между таблицами с разной структурой. Нередко используется копирование с помощью bcp в промежуточные таблицы, из которых средствами T-SQL данные преобразуются в итоговые таблицы.&lt;/p&gt; &lt;p&gt;В простом случае, сначала данные экспортируют из таблицы в файл, а потом из файла импортируют в другую таблицу (в т.ч. в другой БД или на другом сервере). В принципе, файл можно подготовить и другими средствами. Например, можно использовать csv-файлы, но с &lt;a href=&quot;http://technet.microsoft.com/en-us/library/ms188609.aspx&quot; rel=&quot;nofollow&quot;&gt;ограничениями&lt;/a&gt;.&lt;/p&gt; &lt;a href=&quot;http://www.olegaxenow.com/2014/01/rasprostranjonnye-tehnologii-importa.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/8091780659951674152/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2014/01/rasprostranjonnye-tehnologii-importa.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/8091780659951674152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/8091780659951674152'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2014/01/rasprostranjonnye-tehnologii-importa.html' title='Распространённые технологии импорта данных'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-5815403118513203817</id><published>2014-01-16T21:27:00.001+04:00</published><updated>2014-01-16T21:28:08.037+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ETL"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>Импорт данных с точки зрения бизнеса</title><content type='html'>&lt;p&gt;Эта статья открывает небольшой цикл статей об импорте данных. Перед тем, как говорить об импорте данных, имеет смысл понять, какие бизнес-задачи решает импорт. Обычно функциональность импорта решает одну из трех задач, обсуждаемых ниже.&lt;/p&gt; &lt;h2&gt;1. Первоначальный/разовый импорт&lt;/h2&gt; &lt;p&gt;Без первоначального импорта данных редко обходится внедрение любого нового решения, которое приходит на смену старому.&lt;/p&gt; &lt;p&gt;Часто бывает, что старое решение использует разнородные (или как модно говорить - гетерогенные) источники данных. Это могут быть несколько СУБД, файлы Excel или даже просто текстовые файлы. Но даже в случае, когда источник данных - единственная БД того же производителя, задача может быть не очень тривиальной, учитывая различия в структуре данных. &lt;/p&gt; &lt;p&gt;Обычно для первоначального импорта в MS SQL Server используются Integration Services, BULK INSERT (или утилита командной строки bcp) или написанный специально для этой задачи программный код. Подробнее об этих технологиях будет рассказано далее.&lt;/p&gt; &lt;h2&gt;2. Интеграция с помощью БД&lt;/h2&gt; &lt;p&gt;Как вы наверняка знаете, часто требуется интеграция между несколькими программными продуктами (часто даже входящими в одно решение от единственного производителя).&lt;/p&gt; &lt;a href=&quot;http://www.olegaxenow.com/2014/01/import-dannyh-s-tochki-zrenija-biznesa.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/5815403118513203817/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2014/01/import-dannyh-s-tochki-zrenija-biznesa.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/5815403118513203817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/5815403118513203817'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2014/01/import-dannyh-s-tochki-zrenija-biznesa.html' title='Импорт данных с точки зрения бизнеса'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-5566047203440330683</id><published>2013-11-16T21:40:00.001+04:00</published><updated>2013-11-16T21:46:20.716+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SqlTricks"/><title type='text'>SQL-скрипты для поиска данных</title><content type='html'>&lt;p&gt;Иногда мы точно знаем что и где искать, иногда только приблизительно знаем что и лишь догадываемся где. Хочу поделиться несколькими скриптами под MS SQL Server для последнего случая.&lt;/p&gt; &lt;h2&gt;Поиск объектов во всех базах данных сервера&lt;/h2&gt; &lt;p&gt;У вас бывало, что нужно найти таблицу чтобы посмотреть данные или структуру, а вы не помните точно в какой БД она находится? У меня, периодически, такое случается. Пример - найти таблицы из проекта пятилетней давности, чтобы посмотреть как тогда решал текущую задачу.&lt;/p&gt; &lt;p&gt;К счастью, есть процедура &lt;em&gt;sp_MSforeachdb&lt;/em&gt;, которая позволяет написать такой скрипт довольно компактно:&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;DECLARE&lt;/span&gt; @name &lt;span class=&quot;kwrd&quot;&gt;AS&lt;/span&gt; SYSNAME,&lt;br /&gt;        @strSQL &lt;span class=&quot;kwrd&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;MAX&lt;/span&gt;)&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;SET&lt;/span&gt; @name = &lt;span class=&quot;str&quot;&gt;&#39;Hierarchy&#39;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;SET&lt;/span&gt; @strSQL = &lt;span class=&quot;str&quot;&gt;&#39;&lt;br /&gt;IF EXISTS(SELECT * FROM ?..sysobjects WHERE name LIKE &#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;%&#39;&lt;/span&gt;+@name+&lt;span class=&quot;str&quot;&gt;&#39;%&#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;)&lt;br /&gt;BEGIN&lt;br /&gt;    SELECT &#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;?&#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39; db, name FROM ?..sysobjects WHERE name LIKE &#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;%&#39;&lt;/span&gt;+@name+&lt;span class=&quot;str&quot;&gt;&#39;%&#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;&lt;br /&gt;END&lt;br /&gt;&#39;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;TABLE&lt;/span&gt; #&lt;span class=&quot;kwrd&quot;&gt;result&lt;/span&gt;(&lt;br /&gt;    db SYSNAME,&lt;br /&gt;    name SYSNAME,&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;KEY&lt;/span&gt;(db,name))&lt;br /&gt;&lt;br /&gt;INSERT #&lt;span class=&quot;kwrd&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;EXEC&lt;/span&gt; sp_MSforeachdb @strSQL&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;SELECT&lt;/span&gt; * &lt;span class=&quot;kwrd&quot;&gt;FROM&lt;/span&gt; #&lt;span class=&quot;kwrd&quot;&gt;result&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;DROP&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;TABLE&lt;/span&gt; #result&lt;/pre&gt;&lt;p&gt;Здесь всё достаточно просто:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Задаём часть названия, по которому будем искать (в данном случае - Hierarchy).&lt;/li&gt;&lt;li&gt;Собираем динамический SQL, который ищет по sysobjects (для некоторых старых версий MS SQL можно вместо VARCHAR(MAX) использовать VARCHAR(2000), например).&lt;br&gt;При этом символ &quot;?&quot; заменится на название БД. &lt;/li&gt;&lt;li&gt;С помощью конструкции INSERT ... EXEC сохраняем все результаты во временную таблицу, чтобы отобразить, в итоге, единый результат.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Поиск подстроки в текстах хранимых процедур&lt;/h2&gt;&lt;p&gt;Как вы знаете, тексты хранимых процедур, триггеров и представлений можно найти в таблице &lt;em&gt;syscomments&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Чтобы наш предыдущий запрос позволил нам найти упоминание в syscomments некоторой подстроки, его можно переписать следующим образом:&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;SET&lt;/span&gt; @strSQL = &lt;span class=&quot;str&quot;&gt;&#39;&lt;br /&gt;SELECT DISTINCT &#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;?&#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39; as db, o.name  FROM [?].dbo.syscomments s&lt;br /&gt;JOIN [?].dbo.sysobjects o ON o.id = s.id WHERE s.[text] LIKE &#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;%&#39;&lt;/span&gt;+@name+&lt;span class=&quot;str&quot;&gt;&#39;%&#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Обратите внимание на DISTINCT - может пригодиться, потому что иногда для одного объекта бывает несколько записей в syscomments.&lt;/p&gt;&lt;h2&gt;Поиск подстроки во всех строковых полях всех таблиц&lt;/h2&gt;&lt;p&gt;Такой скрипт здорово помогает спать спокойно после &quot;чистки&quot; базы перед отправкой клиенту. Естественно, этой областью его применение не ограничивается.&lt;/p&gt;&lt;p&gt;Для этого случая помощник в виде процедуры от MS не нашёлся, поэтому пришлось использовать курсоры:&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;declare&lt;/span&gt; @pattern &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; nvarchar(&lt;span class=&quot;kwrd&quot;&gt;MAX&lt;/span&gt;)&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;set&lt;/span&gt; @pattern = N&lt;span class=&quot;str&quot;&gt;&#39;%Test%&#39;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;set&lt;/span&gt; nocount &lt;span class=&quot;kwrd&quot;&gt;on&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;declare&lt;/span&gt; @&lt;span class=&quot;kwrd&quot;&gt;sql&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; nvarchar(&lt;span class=&quot;kwrd&quot;&gt;MAX&lt;/span&gt;)&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;declare&lt;/span&gt; @&lt;span class=&quot;kwrd&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; sysname&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;declare&lt;/span&gt; tables &lt;span class=&quot;kwrd&quot;&gt;cursor&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; read_only &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;select&lt;/span&gt; name &lt;span class=&quot;kwrd&quot;&gt;from&lt;/span&gt; sys.tables t &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; t.is_ms_shipped = 0&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;open&lt;/span&gt; tables&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;fetch&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;from&lt;/span&gt; tables &lt;span class=&quot;kwrd&quot;&gt;into&lt;/span&gt; @&lt;span class=&quot;kwrd&quot;&gt;table&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;create&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;table&lt;/span&gt; #results(name sysname &lt;span class=&quot;kwrd&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt; nvarchar(&lt;span class=&quot;kwrd&quot;&gt;MAX&lt;/span&gt;) &lt;span class=&quot;kwrd&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;preproc&quot;&gt;@@FETCH_STATUS&lt;/span&gt; = 0&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;begin&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;set&lt;/span&gt; @&lt;span class=&quot;kwrd&quot;&gt;sql&lt;/span&gt; = &lt;span class=&quot;str&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;select&lt;/span&gt; @&lt;span class=&quot;kwrd&quot;&gt;sql&lt;/span&gt; = @&lt;span class=&quot;kwrd&quot;&gt;sql&lt;/span&gt; + &lt;span class=&quot;str&quot;&gt;&#39;&lt;br /&gt;    insert into #results select &#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;&#39;&lt;/span&gt; + @&lt;span class=&quot;kwrd&quot;&gt;table&lt;/span&gt; + &lt;span class=&quot;str&quot;&gt;&#39;.&#39;&lt;/span&gt; + name + &lt;span class=&quot;str&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39; as name, [&#39;&lt;/span&gt; + name + &lt;span class=&quot;str&quot;&gt;&#39;] from [&#39;&lt;/span&gt; + @&lt;span class=&quot;kwrd&quot;&gt;table&lt;/span&gt; + &lt;span class=&quot;str&quot;&gt;&#39;] where [&#39;&lt;/span&gt; + name + &lt;span class=&quot;str&quot;&gt;&#39;] like &#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;&#39;&lt;/span&gt; + @pattern + &lt;span class=&quot;str&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;from&lt;/span&gt; sys.columns c &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; c.object_id = OBJECT_ID(@&lt;span class=&quot;kwrd&quot;&gt;table&lt;/span&gt;) &lt;span class=&quot;kwrd&quot;&gt;and&lt;/span&gt; c.system_type_id &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; &lt;br /&gt;        (&lt;span class=&quot;kwrd&quot;&gt;select&lt;/span&gt; system_type_id &lt;span class=&quot;kwrd&quot;&gt;from&lt;/span&gt; sys.types &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; collation_name &lt;span class=&quot;kwrd&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;exec&lt;/span&gt;(@&lt;span class=&quot;kwrd&quot;&gt;sql&lt;/span&gt;)&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;fetch&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;from&lt;/span&gt; tables &lt;span class=&quot;kwrd&quot;&gt;into&lt;/span&gt; @&lt;span class=&quot;kwrd&quot;&gt;table&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;select&lt;/span&gt; * &lt;span class=&quot;kwrd&quot;&gt;from&lt;/span&gt; #results&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;close&lt;/span&gt; tables&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;drop&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;table&lt;/span&gt; #results&lt;/pre&gt;&lt;p&gt;Помимо курсоров принципы те же. Есть пара нюансов:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ищем таблицы без флага is_ms_shipped, чтобы просматривать только таблицы, созданные на этапе разработки.&lt;/li&gt;&lt;li&gt;Для отбора строковых столбцов вместо списка типов (который поддерживать утомительно) используется фильтр &quot;collation_name is not null&quot;.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Резюме&lt;/h2&gt;&lt;p&gt;Внимательный читатель наверняка догадался по оформлению, что последний пример написан не в то же время что и два первых. Если быть точнее, последний запрос я написал месяц назад. Это я к тому, что на основе подобного подхода вы можете сами писать полезные скрипты, решающие ваши специфические задачи.&lt;/p&gt;&lt;p&gt;Если такой формат понравится читателям, буду иногда выкладывать полезные скрипты из личной коллекции.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Если у вас есть замечания, пожелания или новые темы – пишите в комментариях, &lt;a href=&quot;http://twitter.com/#!/OlegAxenow&quot; rel=&quot;nofollow&quot;&gt;твиттер&lt;/a&gt; или на &lt;a href=&quot;http://olegaxenow.reformal.ru/&quot; rel=&quot;nofollow&quot;&gt;olegaxenow.reformal.ru&lt;/a&gt;. Постараюсь учесть.&lt;/em&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/5566047203440330683/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2013/11/sql-skripty-dlja-poiska-dannyh.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/5566047203440330683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/5566047203440330683'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2013/11/sql-skripty-dlja-poiska-dannyh.html' title='SQL-скрипты для поиска данных'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-3503336546978484418</id><published>2012-02-08T23:20:00.001+04:00</published><updated>2012-02-09T16:19:23.428+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="NuGet"/><category scheme="http://www.blogger.com/atom/ns#" term="Scaffolding"/><title type='text'>Разработка пакетов NuGet + инфраструктура</title><content type='html'>&lt;p&gt;
В &lt;a title=&quot;Model scaffolding для MVC 3 &amp;ndash; идеи и принципы (мой блог)&quot; href=&quot;http://www.olegaxenow.com/2011/06/model-scaffolding-mvc-3-idei-i-principy.html&quot; target=&quot;_blank&quot;&gt;статье &amp;quot;Model scaffolding для MVC 3 – идеи и принципы&amp;quot;&lt;/a&gt; я рассказал об идеях и принципах, заложенных в основу пакета &lt;a title=&quot;Model Scaffolding (CodePlex)&quot; href=&quot;http://modelscaffolding.codeplex.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Model Scaffolding&lt;/a&gt;. Сейчас я расскажу о следующем:
&lt;ul&gt;
&lt;li&gt; Как написать простой пакет NuGet.&lt;/li&gt;
&lt;li&gt; Как подготовить инфраструктуру для разработки и отладки пакетов NuGet.&lt;/li&gt;
&lt;li&gt; Как &lt;em&gt;начать&lt;/em&gt; реализовывать свой Scaffolder (генератор чего-либо в любом вашем проекте, необязательно ASP.NET MVC).&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Важное замечание:&lt;/strong&gt; после выхода NuGet 1.6 вы можете столкнуться с неожиданными ошибками при установке любых пакетов NuGet для Scaffolding (мои пакеты зависят от T4Scaffolding). В этом случае рекомендую такую последовательность:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uninstall NuGet.
&lt;li&gt;Install NuGet.
&lt;li&gt;Затем то же самое для всех Scaffolding-пакетов (с учетом зависимостей некоторые установятся сами).&lt;/li&gt;

&lt;h4&gt;
NuGet&lt;/h4&gt;
&lt;p&gt;
Scaffolder имеет смысл делать именно NuGet-пакетом, поэтому коротко расскажу о том что это и как создать и опубликовать пакет в простом случае (подробнее можно почитать в &lt;a title=&quot;Creating and Publishing a Package (nuget.org)&quot; href=&quot;http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;документации&lt;/a&gt;). Про возможности NuGet я уже рассказывал раньше, в статье &lt;a title=&quot;MVC 3 + scaffolding (мой блог)&quot; href=&quot;http://www.olegaxenow.com/2011/05/mvc-3-scaffolding.html&quot; target=&quot;_blank&quot;&gt;MVC 3 + scaffolding&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
NuGet-пакет формируется из набора файлов с помощью файла спецификации и приложения NuGet.exe. Затем его можно опубликовать на NuGet.org или на другом (например, своем) сервере. Также можно просто скопировать в некоторую папку, а папку добавить в настройки Visual Studio (Tools / Library Package Manager / Package Manager Settings). Так что, если хотите использовать возможности NuGet в своей закрытой разработке – это тоже возможно.&lt;/p&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href=&quot;http://www.olegaxenow.com/2012/02/razrabotka-paketov-nuget-infrastruktura.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/3503336546978484418/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2012/02/razrabotka-paketov-nuget-infrastruktura.html#comment-form' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/3503336546978484418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/3503336546978484418'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2012/02/razrabotka-paketov-nuget-infrastruktura.html' title='Разработка пакетов NuGet + инфраструктура'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn-FPSItYlTrLhXKald1cqBdX7PH73DHv-GwnfA8K6LWrgDcIOg0Sq2__Cx7uZndXXhmIwAgU_FdpsDG37clJxTd8tWc7aQVVU3vz-J9Qw-EgjqUPGmztz7amlRs6J4ILsRXpU0rSdLMTS/s72-c?imgmax=800" height="72" width="72"/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-8187005455314946050</id><published>2012-01-15T22:56:00.001+04:00</published><updated>2012-01-15T23:30:03.743+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><category scheme="http://www.blogger.com/atom/ns#" term="Scaffolding"/><title type='text'>Code First Migrations + Entity Framework 4.3 Beta 1</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_MYFRe0bM8BeTgMAF3PumqI6bHYn8I-NLD1bmnJqezbrs3h4WjTXcQROJ510gyCRJqIKO_GSQLMQvuvVd5ZutDSLDlR6j_sz4AJYJ7KXGMeCeZ54-BObFtVXArfJs8sf7Un5Z_YU7o1n2/s1600-h/MonarchButterfly2.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;MonarchButterfly&quot; border=&quot;0&quot; alt=&quot;MonarchButterfly&quot; align=&quot;right&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwaq5k8mA0jQmEr048zTsaA1hcZ6m56bhOkpUhXS9WqH1_xrv9nO94Jt1BxrP9fDi3_MYnU_uEQzU-Uh8u5XamZkB5TMSJBfEFve2HLmC0iLDSKB1IFHLxTTKUUld9cwZU-M7U3NNMQrHD/?imgmax=800&quot; width=&quot;244&quot; height=&quot;164&quot;&gt;&lt;/a&gt;На днях, а точнее 12 января увидел свет &lt;a title=&quot;EF 4.3 Beta 1 Released (ADO.NET team blog)&quot; href=&quot;http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-beta-1-released.aspx&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Entity Framework 4.3 Beta 1&lt;/a&gt;. Основная тема этого релиза – EF Code First Migrations. Помимо этого, есть несколько изменений, которые тоже имеет смысл упомянуть.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;font size=&quot;1&quot;&gt;На фото миграция бабочки монарх (CC BY-NC-ND 2.0, оригинал &lt;/font&gt;&lt;/em&gt;&lt;a title=&quot;Monarchs in motion (Flickr)&quot; href=&quot;http://flic.kr/p/4RGhop&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;&lt;font size=&quot;1&quot;&gt;здесь&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&lt;font size=&quot;1&quot;&gt;).&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;В этой статье я, со своей точки зрения, разумеется, отвечу на вопросы, подкрепляя их примерами:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Что такое миграции и для чего они нужны? &lt;br&gt;
&lt;li&gt;Что интересного в этом релизе и в EF Code First Migrations вообще?&lt;/li&gt;&lt;br&gt;
&lt;p&gt;Думаю, вряд ли кто-то использует миграции в повседневной коммерческой разработке. Поэтому я не буду явно выделять список нововведений, а буду просто рассказывать про миграции, отдельно выделяя новое в EF 4.3 Beta 1.&lt;/p&gt;&lt;p&gt;Кстати, наверное вам будет интересно, что релиз EF 4.3 планируется на &lt;em&gt;первый квартал этого года.&lt;/em&gt; Жаль только что релиз EF 5.0 с поддержкой enum и оптимизированной скоростью ждёт наc нескоро – с выходом .NET 4.5 ожидается только EF 5.0 Beta 1.&lt;/p&gt;&lt;h4&gt;&lt;/h4&gt;&lt;h4&gt;Краткое описание миграций&lt;/h4&gt;&lt;p&gt;Миграции в EF предназначены для решения проблемы изменения структуры базы данных в процессе эволюции приложения. Один из вариантов решения этой проблемы я озвучивал ранее в статье “&lt;a title=&quot;Основы SQL - DDL и рефакторинг БД&quot; href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-ddl-i-refaktoring-bd.html&quot; target=&quot;_blank&quot;&gt;Основы SQL - DDL и рефакторинг БД&lt;/a&gt;”. Надеюсь, что когда будет готов EF Code First Migrations, он будет значительно лучше, чем подход со скриптами.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Важное замечание:&lt;/strong&gt; основной момент, который нужно отслеживать при миграции базы данных вообще, помимо соответствия структуры, – сохранность клиентских данных.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href=&quot;http://www.olegaxenow.com/2012/01/code-first-migrations-entity-framework.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/8187005455314946050/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2012/01/code-first-migrations-entity-framework.html#comment-form' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/8187005455314946050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/8187005455314946050'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2012/01/code-first-migrations-entity-framework.html' title='Code First Migrations + Entity Framework 4.3 Beta 1'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwaq5k8mA0jQmEr048zTsaA1hcZ6m56bhOkpUhXS9WqH1_xrv9nO94Jt1BxrP9fDi3_MYnU_uEQzU-Uh8u5XamZkB5TMSJBfEFve2HLmC0iLDSKB1IFHLxTTKUUld9cwZU-M7U3NNMQrHD/s72-c?imgmax=800" height="72" width="72"/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-7393810212064016511</id><published>2012-01-09T18:46:00.001+04:00</published><updated>2012-01-09T18:46:20.588+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code"/><category scheme="http://www.blogger.com/atom/ns#" term="Refactoring"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>Code Metrics + Refactoring</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz-765DtEFFCLcBGcXhj5Y63zwj5SOrALNO-j3XJLOUAAHsz-98TeM77DiCCnM7HDc2q1xAU8zCgnjbSHo08IWcPYqiJ2HJKzKR3J3IePgJ85kfL8z96y6zIv5c685wV-Cv-W6N9Qh0iEK/s1600-h/Microscope2.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;Microscope&quot; border=&quot;0&quot; alt=&quot;Microscope&quot; align=&quot;right&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGjrw1WFlh_6kynXFWqj1xZGfUw-djspERCnJiqypeqX6le3UqWCzYpIN49I_aCCHvkkO6oP7kFfdWfLH6VyZ-Q_Zb4-03J5JL9jhIw1eFuhiNuaGjx0S4WV3T_a0k1Wwc6j0vLeGEWh9R/?imgmax=800&quot; width=&quot;184&quot; height=&quot;244&quot;&gt;&lt;/a&gt;Думаю, большинство из вас знают, что в Visual Studio есть набор метрик кода. Моя цель – привлечь к ним ваше внимание, в том числе как к одной из отправных точек для &lt;strong&gt;ревью кода и рефакторинга&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Сначала я расскажу о запуске подсчёта метрик. Потом кратко опишу каждую метрику и дам некоторые рекомендации по рефакторингу в случае проблем. Затем немного расскажу о моём опыте использования метрик на практике.&lt;/p&gt; &lt;p&gt;Однако, начиная разговор о метриках кода в Visual Studio, хочу пояснить моё отношение к метрикам кода вообще.&lt;/p&gt; &lt;p&gt;С одной стороны, это мощный инструмент для оценки качества кода. По моему мнению, его обязательно стоит использовать как отправную точку для ревью кода (в том случае, когда идем не от коммита, а делаем ревью отдельного класса/модуля).&lt;/p&gt; &lt;p&gt;С другой стороны, не стоит идеализировать метрики кода – это всего лишь один из инструментов. Вы же не считаете, что раз молоток хорошо забивает гвозди, это лучшее средство для закручивания шурупов? ;)&lt;/p&gt; &lt;a href=&quot;http://www.olegaxenow.com/2012/01/code-metrics-refactoring.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/7393810212064016511/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2012/01/code-metrics-refactoring.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/7393810212064016511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/7393810212064016511'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2012/01/code-metrics-refactoring.html' title='Code Metrics + Refactoring'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGjrw1WFlh_6kynXFWqj1xZGfUw-djspERCnJiqypeqX6le3UqWCzYpIN49I_aCCHvkkO6oP7kFfdWfLH6VyZ-Q_Zb4-03J5JL9jhIw1eFuhiNuaGjx0S4WV3T_a0k1Wwc6j0vLeGEWh9R/s72-c?imgmax=800" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-2668648508478645076</id><published>2012-01-08T00:34:00.001+04:00</published><updated>2012-01-08T00:34:12.155+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>Productivity Power Tools</title><content type='html'>&lt;p&gt;&lt;img style=&quot;display: inline; float: right&quot; align=&quot;right&quot; src=&quot;http://i1.visualstudiogallery.msdn.s-msft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef/image/file/29669/12/screenshot.png&quot;&gt;Если говорить о Productivity Power Tools нейтральным тоном, то это плагин к Visual Studio, который можно бесплатно &lt;a title=&quot;Productivity Power Tools (Visual Studio Gallery)&quot; href=&quot;http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;загрузить с Visual Studio Gallery&lt;/a&gt;. Там же вы найдёте его описание на английском языке. Картинка оттуда же и хотя выглядит странно, однако, метафорически, так и есть – это не что иное как возможность “подкрутить” студию чтобы работать с ней было еще немного удобнее.&lt;/p&gt; &lt;p&gt;Скажу сразу, весь набор возможностей (см. описание по ссылке выше) вам вряд ли понадобится. Однако одно я могу сказать наверняка – если вы используете студию без других дополнительных средств для навигации по коду и рефакторинга, то я очень удивлён, что вы читаете эти строки не закончив чтение на заголовке со словами “что о нём читать, и так всё знаю” :)&lt;/p&gt; &lt;p&gt;Поэтому обладателям “чистой студии” рекомендую как минимум скачать этот плагин и попробовать. В результате наверняка пригодятся практически все предоставляемые возможности.&lt;/p&gt; &lt;p&gt;Тем же, кто использует ReSharper и его альтернативы, вероятно будет интересно узнать, чем же меня “купил” плагин Productivity Power Tools. Сначала расскажу о двух “фишках” которые будут полезны многим, а потом о той, специфической, которая сильно повысила комфортность работы лично для меня. А в конце немного о других возможностях.&lt;/p&gt; &lt;h4&gt;&lt;/h4&gt; &lt;a href=&quot;http://www.olegaxenow.com/2012/01/productivity-power-tools.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/2668648508478645076/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2012/01/productivity-power-tools.html#comment-form' title='Комментарии: 13'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/2668648508478645076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/2668648508478645076'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2012/01/productivity-power-tools.html' title='Productivity Power Tools'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTizToeYnVlPtyDrSAb55Ijh9eX0_dbg2L-1WibofJbUTmMbE4w_5ENYICCMnHBx7gBpw7bKp75pafeiCA0mK90_TATRFNRpH9KsQZQJop2QkuUCUzTbXHmijga-7-HbIuH-ULo7Yn-mbQ/s72-c?imgmax=800" height="72" width="72"/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-1478160587035775286</id><published>2011-12-18T22:41:00.001+04:00</published><updated>2011-12-18T22:52:38.419+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><title type='text'>Отладка сессии ASP.NET</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqPKaPOQYRSlhiai6dLQMqMsCUGFQ4WA7x91mXu9lfEnykkLNGxbRl7_zQYVxV2MamqrhcRQ7NSZXGJ7vAjw6ANc2eLHbvRgP1VpUfnEP7PWIErCRE8aYI76eDism627plPfRY1DbvMK6f/s1600-h/CrashTestDummy5.jpg&quot;&gt;&lt;img align=&quot;right&quot; alt=&quot;CrashTestDummy&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJjlZL2it-ZolIRm6lAFZV6ObgB77QKlWGHIEZxsxOA7ARN1xRB2LiN4bLCdijBZu2JROxm2YbN34VGHZbTx-tMWX4ZjElfVAvdemaqLdDW8gW_ZVlnVnmx8OWUIMI_w7LLHIq8aa22shj/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; float: right; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;CrashTestDummy&quot; width=&quot;184&quot;&gt;&lt;/a&gt;На этот раз, как и обещал в статье “&lt;a title=&quot;Сессия ASP.NET и проблема с параллельными запросами&quot; href=&quot;http://www.olegaxenow.com/2011/11/sessiya-aspnet-i-problema-s.html&quot; target=&quot;_blank&quot;&gt;Сессия ASP.NET и проблема с параллельными запросами&lt;/a&gt;”, я расскажу, как можно отладить обращения к сессии с помощью нестандартного провайдера.&lt;/p&gt;
&lt;p&gt;А в завершение, в качестве бонуса, расскажу забавные подробности про режим ReadOnly, который иногда не совсем ReadOnly…&lt;/p&gt;
&lt;p&gt;Для чего может потребоваться логгирование обращений к сессии? На мой взгляд, наиболее подходящими являются два сценария:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Нужно ускорить некоторые страницы нашего приложения, давайте посмотрим где используется сессия и нужна ли там запись в сессию или сессия вообще.” 
&lt;li&gt;“Для того, чтобы не блокировать конкурентные запросы в рамках одной сессии, давайте прогоним все наши сценарии и проанализируем обращения к сессии.”&lt;/li&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/12/otladka-sessii-aspnet.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/1478160587035775286/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/12/otladka-sessii-aspnet.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/1478160587035775286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/1478160587035775286'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/12/otladka-sessii-aspnet.html' title='Отладка сессии ASP.NET'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJjlZL2it-ZolIRm6lAFZV6ObgB77QKlWGHIEZxsxOA7ARN1xRB2LiN4bLCdijBZu2JROxm2YbN34VGHZbTx-tMWX4ZjElfVAvdemaqLdDW8gW_ZVlnVnmx8OWUIMI_w7LLHIq8aa22shj/s72-c?imgmax=800" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-1870752952690923495</id><published>2011-11-27T15:06:00.001+04:00</published><updated>2011-12-18T23:01:09.677+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><title type='text'>Сессия ASP.NET и проблема с параллельными запросами</title><content type='html'>Эта статья будет интересна прежде всего тем, кто, явно или неявно, использует сессию ASP.NET в своих приложениях. Тем же, кто принципиально не использует сессию, можно почитать для общего развития – вдруг пригодится на будущее.&lt;br&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVNAQgWflNZ6dngdKFqPy8jXgF3fz-GxZPGA4iW_thKnVAh7YbqSSFNCU0YLgrLis31_R8ngQGVjhZjVNZdHLIufyxIV2bNKAEEDqEavc_tV0k3-k-XaeLVqly0bc9h9xwxXZz3G6qRTag/s1600-h/mcdonalds_queue%25255B8%25255D.jpg&quot;&gt;&lt;img align=&quot;right&quot; alt=&quot;mcdonalds_queue&quot; border=&quot;0&quot; height=&quot;139&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUfUCLa5_gvn0MFsLR4xmc1RNQfGAHsrYj4PF_wrWFoHvTXI4SahgrXTKOmiac1rwZ43B9Kiv83RI2mKc0erUbrxy5oqo9h0SpV1UElFP-yyx2pccoNEmLOhhSSacrHiktZWBtOx4wRAXi/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; float: right; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mcdonalds_queue&quot; width=&quot;244&quot;&gt;&lt;/a&gt;&lt;br&gt;
И, поверьте мне, она будет невероятно интересна разработчикам таких приложений, которые могут обрабатывать несколько небыстрых одновременных запросов от одного пользователя. Показательный пример – одновременное скачивание нескольких больших файлов. Это реальная проблема, с которой столкнулись мои коллеги и на отладку которой было потрачено неадекватно много времени.&lt;br&gt;
&lt;br&gt;
Проблема состоит, в первую очередь, в неочевидности следующего факта: &lt;strong&gt;в рамках одной сессии (одного SessionID) параллельные запросы выполняются по очереди, если обработчики поддерживают сессию&lt;/strong&gt;.&lt;strong&gt; &lt;/strong&gt;При этом обращений к сессии в обработчике &lt;strong&gt;может не быть вообще &lt;/strong&gt;– важна только поддержка сессии и её предварительная инициализация.&lt;strong&gt; &lt;/strong&gt;В нашем примере это означает то, что пока не закачается один файл, закачивание других не начнется.&lt;br&gt;
&lt;br&gt;
В принципе, ситуация с конкурентными запросами в рамках &lt;em&gt;одной сессии&lt;/em&gt; описана в статье MSDN &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms178581.aspx&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;ASP.NET  Session State Overview (MSDN)&quot;&gt;ASP.NET Session State Overview&lt;/a&gt;. Но есть нюансы. Во-первых, это один неприметный абзац в конце статьи (вместо выделенного блока в начале). Во-вторых, MSDN не раскрывает многих неочевидных моментов. И, что важно, &lt;strong&gt;ни один из моих знакомых ASP.NET разработчиков не знал об этой особенности.&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Заинтересовались? Тогда продолжаем. Я сформулирую несколько правил работы сессии и покажу на примере, что они верны.&lt;br&gt;
&lt;a href=&quot;http://www.olegaxenow.com/2011/11/sessiya-aspnet-i-problema-s.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/1870752952690923495/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/11/sessiya-aspnet-i-problema-s.html#comment-form' title='Комментарии: 27'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/1870752952690923495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/1870752952690923495'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/11/sessiya-aspnet-i-problema-s.html' title='Сессия ASP.NET и проблема с параллельными запросами'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUfUCLa5_gvn0MFsLR4xmc1RNQfGAHsrYj4PF_wrWFoHvTXI4SahgrXTKOmiac1rwZ43B9Kiv83RI2mKc0erUbrxy5oqo9h0SpV1UElFP-yyx2pccoNEmLOhhSSacrHiktZWBtOx4wRAXi/s72-c?imgmax=800" height="72" width="72"/><thr:total>27</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-3184766199697206343</id><published>2011-10-13T01:31:00.001+04:00</published><updated>2011-10-13T15:50:32.560+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><title type='text'>ASP.NET MVC MiniProfiler</title><content type='html'>&lt;p&gt;Всем доброго времени суток. Сегодня я хочу рассказать про &lt;a title=&quot;ASP.NET MVC MiniProfiler&quot; href=&quot;http://code.google.com/p/mvc-mini-profiler/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ASP.NET MVC MiniProfiler&lt;/a&gt;. А первое, что я хочу рассказать, это то, что, вопреки распространённому мнению и названию, этот профайлер вполне можно применять для отладки обычных (не MVC) ASP.NET приложений. Дальше я на примере покажу как это сделать. А пока обо всем по порядку.&lt;/p&gt; &lt;h4&gt;Что такое MiniProfiler?&lt;/h4&gt; &lt;p&gt;Это способ отладить ASP.NET-приложение на production (или, если вам больше нравится, “приложение, находящееся в промышленной эксплуатации”). И, что важно, не сильно влияя на производительность (то, что это работает на сайтах платформы StackExchange как бы намекает).&lt;/p&gt; &lt;p&gt;Вкратце процесс подключения выглядит так:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Добавляется ссылка на dll.  &lt;li&gt;Подключается в “Master Page” или любое другое подходящее место одна строчка по инициализации UI.  &lt;li&gt;В Global.asax.cs прописываются вызовы по старту и остановке профайлера.  &lt;li&gt;Либо добавляются вызовы Step(string) там, где вам интересно, либо “сбоку” добавляются фильтры (вроде ProfilingActionFilter), чтобы не модифицировать код.&lt;/li&gt; &lt;p&gt;Опять же вкратце, на выходе получаем в виде небольшой разворачивающейся “закладки” на странице следующие возможности:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Суммарное время.  &lt;li&gt;Время на дочерние действия (пункт 4) и запросы к БД.  &lt;li&gt;Показать/скрыть “тривиальные” запросы (с маленькими затратами времени).  &lt;li&gt;Переслать ссылку на отчет (данные хранятся в кэше).&lt;/li&gt; &lt;p&gt;Заинтересовались? Тогда продолжим…&lt;/p&gt; &lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/10/aspnet-mvc-miniprofiler.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/3184766199697206343/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/10/aspnet-mvc-miniprofiler.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/3184766199697206343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/3184766199697206343'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/10/aspnet-mvc-miniprofiler.html' title='ASP.NET MVC MiniProfiler'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhup5M9D0b1kshCgddUSsMj3THrFxOcr_OMAEh307H_jGmf_bQxQe5P9fsEEXt84xm5WYegj7iGytzSSSIZhfNDDC34Odvgbd1gSEJn5NCcqbszFx5jHjZyJE3mCkKqflNu81D_Ka8EISSd/s72-c?imgmax=800" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-1272349159596936276</id><published>2011-09-29T23:24:00.001+04:00</published><updated>2011-09-29T23:26:07.514+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><category scheme="http://www.blogger.com/atom/ns#" term="Workspace"/><title type='text'>Удобное и надежное хранение паролей</title><content type='html'>&lt;p&gt;&lt;br&gt;Всем доброго времени суток. После перегруза на работе и отпуска возвращаюсь к своему блогу. Чтобы не было резкого перехода ни для меня, ни для читателей, начну с небольшой заметки о моей инфраструктуре для хранения паролей. Сначала – небольшое лирическое отступление, а самые нетерпеливые могут пролистать до резюме.&lt;/p&gt; &lt;h4&gt;История&lt;/h4&gt; &lt;p&gt;Лет 15 назад паролей у меня было немного – интернет тогда еще не проник в мелкую бытовую технику :) Время шло, менялись работодатели, множились проекты, открывались новые нужные и ненужные сервисы… И лет 7 назад я понял, что держать важные пароли в голове мне надоело, даже учитывая их “генерацию” по определенным правилам. Альтернатива же использовать &lt;em&gt;одинаковые&lt;/em&gt; пароли для разных сервисов была отметена задолго до этого :)&lt;/p&gt; &lt;a href=&quot;http://www.olegaxenow.com/2011/09/blog-post.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/1272349159596936276/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/09/blog-post.html#comment-form' title='Комментарии: 14'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/1272349159596936276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/1272349159596936276'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/09/blog-post.html' title='Удобное и надежное хранение паролей'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-4913633412739878581</id><published>2011-06-16T00:19:00.004+04:00</published><updated>2012-01-07T21:49:38.796+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="Scaffolding"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>Model scaffolding для MVC 3 – идеи и принципы</title><content type='html'>&lt;p&gt;Эта статья является логическим продолжением статей &lt;a title=&quot;ASP.NET MVC 3 + Entity Framework 4.1 Code First (мой блог)&quot; href=&quot;http://www.olegaxenow.com/2011/05/aspnet-mvc-3-entity-framework-41-code.html&quot; target=&quot;_blank&quot;&gt;ASP.NET MVC 3 + Entity Framework 4.1 Code First&lt;/a&gt;, &lt;a title=&quot;MVC 3 + scaffolding (мой блог)&quot; href=&quot;http://www.olegaxenow.com/2011/05/mvc-3-scaffolding.html&quot; target=&quot;_blank&quot;&gt;MVC 3 + scaffolding&lt;/a&gt; и моей презентации на TechDays “&lt;a title=&quot;Пример разработки сайта на MVC 3 (TechDays)&quot; href=&quot;http://www.techdays.ru/videos/3618.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Пример разработки сайта на MVC 3&lt;/a&gt;”. В ней я расскажу про свой пакет для scaffolding’а &lt;a title=&quot;Model Scaffolding for ASP.NET MVC (CodePlex)&quot; href=&quot;http://modelscaffolding.codeplex.com/&quot; target=&quot;_blank&quot;&gt;Model Scaffolding for ASP.NET MVC&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Как я уже говорил ранее, идея написать этот пакет появилась после знакомства с проектом MvcScaffolding. Если вкратце, это пакет NuGet (минимальную необходимую информацию по NuGet и MvcScaffolding я привел в &lt;a title=&quot;MVC 3 + scaffolding (мой блог)&quot; href=&quot;http://www.olegaxenow.com/2011/05/mvc-3-scaffolding.html&quot; target=&quot;_blank&quot;&gt;предыдущей статье&lt;/a&gt;), позволяющий быстро генерировать контроллеры и представления. Для первого знакомства с MvcScaffolding достаточно прочитать статьи автора “&lt;a title=&quot;Scaffold your ASP.NET MVC 3 project with the MvcScaffolding package (Steve Sanderson’s blog)&quot; href=&quot;http://blog.stevensanderson.com/2011/01/13/scaffold-your-aspnet-mvc-3-project-with-the-mvcscaffolding-package/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Scaffold your ASP.NET MVC 3 project with the MvcScaffolding package&lt;/a&gt;” и “&lt;a title=&quot;MvcScaffolding: Standard Usage (Steve Sanderson’s blog)&quot; href=&quot;http://blog.stevensanderson.com/2011/01/13/mvcscaffolding-standard-usage/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;MvcScaffolding: Standard Usage&lt;/a&gt;”, а заинтересовавшимся после первого знакомства, рекомендую читать эту серию статей дальше.&lt;/p&gt;  &lt;p&gt;Для понимания дальнейшего изложения знакомство с MvcScaffolding не требуется, однако для более глубоко понимания потенциальных возможностей как MvcScaffolding так и ModelScaffolding оно будет весьма полезно. Далее я расскажу про ModelScaffolding по порядку, не забыв объяснить идеи и цели, которые лежат в его основе.&lt;/p&gt;  &lt;h4&gt;Disclaimer&lt;/h4&gt;  &lt;p&gt;Я не претендую на особую оригинальность и/или полезность своего подхода к scaffolding’у моделей. Я просто знаю, что есть круг задач которые он решает хорошо, а, на момент создания проекта на CodePlex, сходу не нашел аналога в рамках используемых технологий.&lt;/p&gt;  &lt;p&gt;К слову о “круге задач” – на мой взгляд, это прототипирование, причем необязательно “чистое прототипирование” (когда прототип гарантированно не будет использован в промышленной разработке). А самая идеальная задача – набор сущностей со стандартными названиями свойств и большим количеством простых справочников. К концу этой статьи вы поймете почему, а пока запаситесь терпением ;)&lt;/p&gt; &lt;a href=&quot;http://www.olegaxenow.com/2011/06/model-scaffolding-mvc-3-idei-i-principy.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/4913633412739878581/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/06/model-scaffolding-mvc-3-idei-i-principy.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/4913633412739878581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/4913633412739878581'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/06/model-scaffolding-mvc-3-idei-i-principy.html' title='Model scaffolding для MVC 3 – идеи и принципы'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh644c6HzLb-kY43F7Gtqo9qEhqSsiURL9PA8i62xTGXog1lj-TzIS3cz39Ex2pJKBXpVGlOivvRxNivbmxsOCluqqOujQaIH3YJrRYRQOFLV90Q1XPc5cn4iUHtoKuq6fhmb3p4ELHQGoz/s72-c?imgmax=800" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-1471860049286265994</id><published>2011-05-31T23:01:00.005+04:00</published><updated>2012-01-07T21:49:38.792+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="Scaffolding"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>MVC 3 + scaffolding</title><content type='html'>&lt;p&gt;А теперь обещанное продолжение статьи &lt;a title=&quot;ASP.NET MVC 3 + Entity Framework 4.1 Code First (Мой блог)&quot; href=&quot;http://www.olegaxenow.com/2011/05/aspnet-mvc-3-entity-framework-41-code.html&quot; target=&quot;_blank&quot;&gt;ASP.NET MVC 3 + Entity Framework 4.1 Code First&lt;/a&gt;. Сегодня я расскажу про то, как &lt;strong&gt;быстро создать основу (или прототип)&lt;/strong&gt; для приложения на ASP.NET MVC 3, в том числе, с помощью NuGet-пакета &lt;a title=&quot;MvcScaffolding (CodePlex)&quot; href=&quot;http://mvcscaffolding.codeplex.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;MvcScaffolding&lt;/a&gt;. Надо сказать, что принципы MvcScaffolding пришлись мне по душе и даже вдохновили меня на написание своего пакета для scaffolding’а - &lt;a title=&quot;Model Scaffolding for ASP.NET MVC (CodePlex)&quot; href=&quot;http://modelscaffolding.codeplex.com/&quot; target=&quot;_blank&quot;&gt;Model Scaffolding for ASP.NET MVC&lt;/a&gt;. О нем я расскажу в следующих статьях.&lt;/p&gt;  &lt;p&gt;Поскольку в прошлой статье я уже рассказал про основные понятия и библиотеки (ASP.NET MVC, Entity Framework), сейчас я не буду на них подробно останавливаться. Пример будет использовать &lt;strong&gt;scaffolding&lt;/strong&gt;, который я уже упоминал в предыдущий раз.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Disclaimer.&lt;/strong&gt; Отмечу, что &lt;em&gt;scaffolding – это, вообще говоря, быстрая генерация чего-либо, с целью последующей доработки, а не способ быстро написать законченное сложное приложение.&lt;/em&gt;&lt;/p&gt;  &lt;h4&gt;NuGet&lt;/h4&gt;  &lt;p&gt;Пожалуй, единственное, на чем я забыл остановиться в прошлый раз, это &lt;a title=&quot;NuGet (официальный сайт)&quot; href=&quot;http://nuget.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;NuGet&lt;/a&gt;. Сама идея его не нова (apt-get, Ruby Gems и т.п.), однако то, что это теперь доступно и в Visual Studio очень радует. Следуя описанию с официального сайта:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;NuGet is a Visual Studio extension that makes it easy to install and update open source libraries and tools in Visual Studio.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;В принципе, добавить нечего, однако я все-таки немного добавлю :)&lt;/p&gt;
&lt;a href=&quot;http://www.olegaxenow.com/2011/05/mvc-3-scaffolding.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/1471860049286265994/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/05/mvc-3-scaffolding.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/1471860049286265994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/1471860049286265994'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/05/mvc-3-scaffolding.html' title='MVC 3 + scaffolding'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhssrUc3_aZe-36RCaq6sxBRUDV1YN6Y7Gasvr-8Ea26o1nCb4tast8duG7db2htwyWp2_MWr3dO8Eqaqu78v6Pe_Kl4WTe3d6bwk5p4lf6PgNats0xeUh00PCOjXyKsHKeQkwFlWwsvBKN/s72-c?imgmax=800" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-190511456782057223</id><published>2011-05-11T00:25:00.003+04:00</published><updated>2012-01-07T21:49:38.794+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>ASP.NET MVC 3 + Entity Framework 4.1 Code First</title><content type='html'>&lt;p&gt;Как вы все знаете, недавно вышло обновление MVC 3 Tools, ключевой особенностью которого является более продвинутый scaffolding. Кстати, scaffolding теперь есть и для движка &lt;a title=&quot;ASP.NET MVC 3 + Razor (мой блог)&quot; href=&quot;http://www.olegaxenow.com/2010/12/aspnet-mvc-3-razor.html&quot; target=&quot;_blank&quot;&gt;Razor&lt;/a&gt;, что тоже плюс. Об этом, а также о недавнем обновлении Entity Framework я сегодня и расскажу. В этой статье речь пойдет про сами обновления, а в следующей будут примеры использования.&lt;/p&gt;  &lt;p&gt;Забегая вперед скажу, что scaffolding (по крайней мере, в случае ASP.NET MVC) это возможность быстро генерировать простую логику и интерфейс, которую можно использовать как прототип или в качестве отправной точки в дальнейшей разработке. Также этот подход может работать почти в чистом виде для простого административного интерфейса.&lt;/p&gt;  &lt;h4&gt;MVC (Model-View-Controller)&lt;/h4&gt;  &lt;p&gt;Наверняка, 99% читателей знают что такое MVC, однако, на всякий случай, расскажу очень коротко, а подробнее можно посмотреть в википедии (&lt;a title=&quot;Model-View-Controller (википедия)&quot; href=&quot;http://ru.wikipedia.org/wiki/Model-View-Controller&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;русскоязычной&lt;/a&gt; или &lt;a title=&quot;Model–view–controller (wikipedia)&quot; href=&quot;http://en.wikipedia.org/wiki/Model&amp;ndash;view&amp;ndash;controller&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;англоязычной&lt;/a&gt;) и приведенных в ней ссылках.&lt;/p&gt;  &lt;p&gt;MVC – это шаблон проектирования (хотя часто под ним подразумевают фреймворки, использующие этот шаблон). Основным принципом MVC является разделение ответственности между тремя составляющими:&lt;/p&gt;  &lt;a href=&quot;http://www.olegaxenow.com/2011/05/aspnet-mvc-3-entity-framework-41-code.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/190511456782057223/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/05/aspnet-mvc-3-entity-framework-41-code.html#comment-form' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/190511456782057223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/190511456782057223'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/05/aspnet-mvc-3-entity-framework-41-code.html' title='ASP.NET MVC 3 + Entity Framework 4.1 Code First'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDIgiLduoX7oRwq-TVt35aQMVMdSs0mHQXSbDE24Cuxlm9zs_Veq5-I5EJfoT8JE7E9u1QvWKu26UrkBjFzvIceqvVyf9LEVpw-bBLNZ3kCXUAr8j0kbhX23seae2zrCV8zOKgFZsByV_Y/s72-c?imgmax=800" height="72" width="72"/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-2835003484969156724</id><published>2011-04-25T23:09:00.004+04:00</published><updated>2011-05-05T19:52:05.472+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="InsideSQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>SQL – execution plan</title><content type='html'>&lt;p&gt;Перейдя от &lt;a title=&quot;Статьи с тэгом SqlIntro&quot; href=&quot;http://www.olegaxenow.com/search/label/SqlIntro&quot; target=&quot;_blank&quot;&gt;рассказа про основы SQL&lt;/a&gt; к более сложным вещам, я уже успел упомянуть план выполнения (execution plan). Чтобы не останавливаться на этой теме каждый раз, подробнее расскажу о нем в этой статье. Ведь это то, о чем многие разработчики, знакомые с Microsoft SQL Server не один год, либо не знают, либо не придают особого значения.&lt;/p&gt;  &lt;p&gt;Итак, сегодня я расскажу про такие вещи, как план выполнения и стоимость запроса; покажу на простых примерах как анализировать графический план выполнения; немного расскажу про подводные камни, связанные с планами выполнения; дам информацию для дальнейшего изучения.&lt;/p&gt;  &lt;h4&gt;План выполнения&lt;/h4&gt;  &lt;p&gt;Движку базы данных необходимо знать, в какой последовательности и каким способом соединять таблицы, какие индексы использовать и т.п. Иными словами, перед выполнением запроса необходимо построить (или взять из кэша) план выполнения.&lt;/p&gt;  &lt;a href=&quot;http://www.olegaxenow.com/2011/04/sql-execution-plan.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/2835003484969156724/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/04/sql-execution-plan.html#comment-form' title='Комментарии: 17'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/2835003484969156724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/2835003484969156724'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/04/sql-execution-plan.html' title='SQL – execution plan'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYbTVamJmHzgU63AJ8hdF_mgJKlF-v_i2FVT26ofcUFyLRV8o_IlWy8f3LjylwlrdYmeAPhIYhjq_wfPUzn_I3IATyEnVDyvZgIasFjap72jK4WR4Vj6UkbxDH3Cwejuaz8jEBKTe5oyYz/s72-c?imgmax=800" height="72" width="72"/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-2604508914335104427</id><published>2011-04-18T21:13:00.002+04:00</published><updated>2011-04-18T21:15:52.121+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DML"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SqlTricks"/><title type='text'>Трюки в SQL – используем CASE</title><content type='html'>&lt;p&gt;После &lt;a title=&quot;Статьи с тэгом SqlIntro&quot; href=&quot;http://www.olegaxenow.com/search/label/SqlIntro&quot; target=&quot;_blank&quot;&gt;серии статей “Основы SQL”&lt;/a&gt; я решил попробовать вспомнить некоторые нестандартные варианты использования Transact-SQL и начать серию статей “Трюки в SQL”.&lt;/p&gt;

&lt;p&gt;В этой статье расскажу прежде всего о полезном но неочевидном использовании &lt;a title=&quot;Выражение CASE (MSDN)&quot; href=&quot;http://msdn.microsoft.com/ru-ru/library/ms181765.aspx&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;выражения CASE&lt;/a&gt;. Правда, речь пойдет о достаточно простых приемах (когда их знаешь). Основное содержание:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/tryuki-v-sql-ispolzuem-case.html#plan&quot;&gt;План выполнения&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/tryuki-v-sql-ispolzuem-case.html#case&quot;&gt;Синтаксис CASE&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/tryuki-v-sql-ispolzuem-case.html#sum&quot;&gt;SUM по CASE&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/tryuki-v-sql-ispolzuem-case.html#order&quot;&gt;ORDER по CASE&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;База данных для примеров&lt;/h4&gt;

&lt;p&gt;Если в прошлой серии я использовал максимально простую БД, которую создал и наполнил скриптами, то теперь я решил использовать стандартные примеры от Microsoft. Причина в том, что потребуются более сложные структуры и данные, да и примеры станут ближе к реальной жизни.&lt;/p&gt;

&lt;p&gt;Поэтому для запуска примера потребуется БД AdventureWorks. Я пользовался &lt;a title=&quot;AdventureWorks для SQL Server 2005 SP2a (CodePlex)&quot; href=&quot;http://msftdbprodsamples.codeplex.com/releases/view/4004#DownloadId=11757&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;облегченной версией для Microsoft SQL Server 2005&lt;/a&gt; (там, в зависимости от версии, можно выбрать AdventureWorksLT.msi или AdventureWorksLT_x64.msi). Скорее всего, подойдут и &lt;a title=&quot;Sample Databases (CodePlex)&quot; href=&quot;http://msftdbprodsamples.codeplex.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;более поздние версии с CodePlex&lt;/a&gt;.&lt;/p&gt;
&lt;a name=&quot;plan&quot;&gt;&lt;/a&gt;

&lt;h4&gt;План выполнения&lt;/h4&gt;

&lt;p&gt;Расскажу на случай, если вы не знаете про план выполнения. В этой статьях этой серии он будет периодически упоминаться. Это пятилетний план выполнения… шутка, надеюсь вашим запросам никогда не придется так долго работать :)&lt;/p&gt;

&lt;a href=&quot;http://www.olegaxenow.com/2011/04/tryuki-v-sql-ispolzuem-case.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/2604508914335104427/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/04/tryuki-v-sql-ispolzuem-case.html#comment-form' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/2604508914335104427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/2604508914335104427'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/04/tryuki-v-sql-ispolzuem-case.html' title='Трюки в SQL – используем CASE'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-6288307344966644239</id><published>2011-04-18T13:47:00.009+04:00</published><updated>2011-04-18T20:54:40.403+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DML"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SqlIntro"/><title type='text'>Основы SQL – DML – SELECT – Часть III</title><content type='html'>&lt;p&gt;В прошлый раз в этой &lt;a title=&quot;Статьи с тэгом SqlIntro&quot; href=&quot;http://www.olegaxenow.com/search/label/SqlIntro&quot; target=&quot;_blank&quot;&gt;серии статей&lt;/a&gt; я рассказал об операторе “SELECT”, в том числе, для многотабличных запросов. Сейчас я продолжу эту тему, показав, как можно использовать группировку, и в завершении прикреплю скрипт для всех статей про “SELECT”.&lt;/p&gt;

&lt;p&gt;Содержание:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html#distinct&quot;&gt;DISTINCT&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html#union&quot;&gt;Объединения (UNION)&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html#group&quot;&gt;Группировки (GROUP BY)&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html#stat&quot;&gt;Статистические функции&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html#having&quot;&gt;Фильтрация групп (HAVING)&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html#over&quot;&gt;OVER, пейджинг и ранжирующие функции&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html#out&quot;&gt;За кадром&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html#resume&quot;&gt;Резюме&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;a name=&quot;distinct&quot; id=&quot;distinct&quot;&gt;
  &lt;h4&gt;DISTINCT&lt;/h4&gt;
&lt;/a&gt;

&lt;p&gt;С помощью “DISTINCT” мы можем получить уникальные строки для практически любого запроса. Простейший пример, показывающий первые три цифры телефонных номеров:&lt;/p&gt;

&lt;div class=&quot;csharpcode-wrapper&quot;&gt;
  &lt;pre id=&quot;codeSnippet&quot; class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;DISTINCT&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;LEFT&lt;/span&gt;(Phone,3) &lt;span class=&quot;kwrd&quot;&gt;FROM&lt;/span&gt; Phones&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Про использование “DISTINCT”, в силу его простоты, многого не скажешь. Однако, стоит сказать несколько слов про то, когда его использовать нежелательно. Предположим, нам необходимо получить список всех абонентов, у которых есть хотя бы один телефон. Теоретически, можно это сделать с помощью “DISTINCT”:&lt;/p&gt;

&lt;div id=&quot;codeSnippetWrapper&quot; class=&quot;csharpcode-wrapper&quot;&gt;
  &lt;pre id=&quot;codeSnippet&quot; class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;DISTINCT&lt;/span&gt; a.PersonID, a.LastName&lt;br&gt;    &lt;span class=&quot;kwrd&quot;&gt;FROM&lt;/span&gt; Persons a &lt;span class=&quot;kwrd&quot;&gt;JOIN&lt;/span&gt; Phones t &lt;span class=&quot;kwrd&quot;&gt;ON&lt;/span&gt; a.PersonID = t.PersonID&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Однако в данном случае правильнее использовать конструкцию “WHERE EXISTS”:&lt;/p&gt;

&lt;div id=&quot;codeSnippetWrapper&quot; class=&quot;csharpcode-wrapper&quot;&gt;
  &lt;pre id=&quot;codeSnippet&quot; class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;SELECT&lt;/span&gt; a.PersonID, a.LastName&lt;br&gt;    &lt;span class=&quot;kwrd&quot;&gt;FROM&lt;/span&gt; Persons a&lt;br&gt;    &lt;span class=&quot;kwrd&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;EXISTS&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;SELECT&lt;/span&gt; * &lt;span class=&quot;kwrd&quot;&gt;FROM&lt;/span&gt; Phones t &lt;span class=&quot;kwrd&quot;&gt;WHERE&lt;/span&gt; a.PersonID = t.PersonID)&lt;/pre&gt;
&lt;/div&gt;

&lt;a href=&quot;http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/6288307344966644239/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6288307344966644239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6288307344966644239'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/04/osnovy-sql-dml-select-chast-iii.html' title='Основы SQL – DML – SELECT – Часть III'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-6354139531213376545</id><published>2011-03-29T23:18:00.003+04:00</published><updated>2011-03-31T14:56:24.399+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DML"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SqlIntro"/><title type='text'>Основы SQL – DML – SELECT – Часть II</title><content type='html'>&lt;p&gt;В прошлый раз в этой &lt;a title=&quot;Статьи с тэгом SqlIntro&quot; href=&quot;http://www.olegaxenow.com/search/label/SqlIntro&quot; target=&quot;_blank&quot;&gt;серии статей&lt;/a&gt; я рассказал об операторе “SELECT” в самом простом его проявлении – запросы к одной таблице, без сложных фильтров. Теперь я расскажу о более интересной, но сложной теме – многотабличных запросах.&lt;/p&gt;

&lt;p&gt;Также, в завершении статьи, я дам несколько полезных рекомендаций, предотвращающих превращение поддержки многотабличных запросов в постоянную головную боль.&lt;/p&gt;

&lt;h4&gt;Многотабличные запросы без JOIN&lt;/h4&gt;

&lt;p&gt;Хотя в более ранних версиях Microsoft SQL Server многотабличные запросы без “JOIN” были более распространены, теперь они используются все реже и реже. И это, с моей точки зрения, правильно. Использование “JOIN” приводит, как минимум, к более структурированному и читаемому коду (что мы увидим чуть позже), а на символах в исходном коде я никогда не экономил :)&lt;/p&gt;

&lt;p&gt;Самый простой вариант многотабличного запроса – это двухтабличные запрос без условия соединения таблиц или &lt;a title=&quot;декартово (прямое) произведение (википедия)&quot; href=&quot;http://ru.wikipedia.org/wiki/Прямое_произведение&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;декартово произведение&lt;/a&gt; таблиц. И это, пожалуй, единственный вариант, когда от отсутствия “JOIN” не страдает наглядность:&lt;/p&gt;

&lt;div id=&quot;codeSnippetWrapper&quot; class=&quot;csharpcode-wrapper&quot;&gt;
  &lt;pre id=&quot;codeSnippet&quot; class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;SELECT&lt;/span&gt; * &lt;span class=&quot;kwrd&quot;&gt;FROM&lt;/span&gt; Persons, Phones&lt;/pre&gt;
&lt;/div&gt;

&lt;a href=&quot;http://www.olegaxenow.com/2011/03/osnovy-sql-dml-select-chast-ii.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/6354139531213376545/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/03/osnovy-sql-dml-select-chast-ii.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6354139531213376545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6354139531213376545'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/03/osnovy-sql-dml-select-chast-ii.html' title='Основы SQL – DML – SELECT – Часть II'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-6619554343271965478</id><published>2011-03-19T23:37:00.003+03:00</published><updated>2011-03-29T23:20:16.428+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DML"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SqlIntro"/><title type='text'>Основы SQL – DML – SELECT – Часть I</title><content type='html'>&lt;p&gt;Продолжаю &lt;a title=&quot;Статьи с тэгом SqlIntro&quot; href=&quot;http://www.olegaxenow.com/search/label/SqlIntro&quot; target=&quot;_blank&quot;&gt;серию статей “Основы SQL”&lt;/a&gt;. В этой статье я расскажу про сравнительно простые варианты применения самого сложного оператора DML – SELECT. Если в начале статьи дать полный синтаксис SELECT – это будет серьезным поводом загрустить и не читать статью дальше, поэтому я буду рассказывать про возможности этого оператора постепенно :)&lt;/p&gt;

&lt;h4&gt;Простейший случай&lt;/h4&gt;

&lt;p&gt;Позволю себе немного дополнить &lt;a title=&quot;SELECT (MSDN)&quot; href=&quot;http://msdn.microsoft.com/ru-ru/library/ms189499(v=SQL.105).aspx&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;статью MSDN о SELECT&lt;/a&gt; тем, что данный оператор может использоваться не только для &amp;quot;выборки одной или нескольких строк или столбцов из одной или нескольких таблиц&amp;quot;, но и для получения набора данных, не имеющего в своей основе ни одной таблицы:&lt;/p&gt;

&lt;div id=&quot;codeSnippetWrapper&quot; class=&quot;csharpcode-wrapper&quot;&gt;
  &lt;pre id=&quot;codeSnippet&quot; class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;SELECT&lt;/span&gt; 1 &lt;span class=&quot;kwrd&quot;&gt;AS&lt;/span&gt; ID, &lt;span class=&quot;str&quot;&gt;&amp;#39;Test 1&amp;#39;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;AS&lt;/span&gt; Name&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Разумеется, в итоге результат выглядит как выборка из некоторой таблицы (если мы не будем использовать специальные конструкции для получения результата в виде XML).&lt;/p&gt;

&lt;p&gt;Если одной строки недостаточно, можно использовать несколько запросов, объединенных с помощью UNION ALL. Если не использовать “ALL” в этой конструкции, в результате гарантированно не будет дублирующихся строк. Это тоже бывает полезно, но, если вы точно знаете, что дубликатов и так не будет, лучше использовать “UNION ALL”, чтобы уменьшить накладные расходы.&lt;/p&gt;
&lt;a href=&quot;http://www.olegaxenow.com/2011/03/osnovy-sql-dml-select-chast-i.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/6619554343271965478/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/03/osnovy-sql-dml-select-chast-i.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6619554343271965478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6619554343271965478'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/03/osnovy-sql-dml-select-chast-i.html' title='Основы SQL – DML – SELECT – Часть I'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-6256611979784436443</id><published>2011-03-14T09:15:00.003+03:00</published><updated>2011-03-14T16:07:35.585+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="Workspace"/><title type='text'>Облачные хранилища файлов – личный опыт</title><content type='html'>Решил, для разнообразия, написать на тему организации рабочего места. Наверняка у многих есть потребность в хранении и синхронизации файлов с помощью, как это модно сейчас говорить, облачного хранилища. Речь не про Azure и иже с ним, а про такие сервисы хранения файлов как DropBox, SkyDrive и т.п.&lt;br&gt;
&lt;br&gt;
Лично я использую их для синхронизации своих заметок, паролей (естественно, зашифрованных), полезных SQL-скриптов и т.п. Удобно иметь актуальные версии и дома, и на работе и в смартфоне.&lt;br&gt;
&lt;br&gt;
В этой короткой статье расскажу про свой местами многолетний, а местами практически нулевой опыт работы с некоторыми из них.  Если кто-то дополнит пробелы в моих знаниях, буду премного благодарен.&lt;br&gt;
&lt;a href=&quot;http://www.olegaxenow.com/2011/03/oblachnye-hranilischa-failov-lichnyi.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/6256611979784436443/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/03/oblachnye-hranilischa-failov-lichnyi.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6256611979784436443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6256611979784436443'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/03/oblachnye-hranilischa-failov-lichnyi.html' title='Облачные хранилища файлов – личный опыт'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-1575947018749835769</id><published>2011-01-28T22:40:00.004+03:00</published><updated>2011-03-29T23:20:16.428+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DML"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SqlIntro"/><title type='text'>Основы SQL – DML – DELETE</title><content type='html'>Продолжаю серию статей “Основы SQL”. В предыдущих сериях: 

&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-pervoe-znakomstvo.html&quot; target=&quot;_blank&quot; title=&quot;Основы SQL - первое знакомство&quot;&gt;Первое знакомство&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-ddl-i-refaktoring-bd.html&quot; target=&quot;_blank&quot; title=&quot;Основы SQL - DDL и рефакторинг БД&quot;&gt;DDL и рефакторинг БД&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-dml-insert-i-drugie.html&quot; target=&quot;_blank&quot; title=&quot;Основы SQL – DML – INSERT и другие&quot;&gt;DML – INSERT и другие&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-dml-update.html&quot; target=&quot;_blank&quot; title=&quot;Основы SQL – DML – UPDATE&quot;&gt;DML – UPDATE&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
В этой статье я завершу рассказ про операторы DML, изменяющие данные - речь пойдет про DELETE – оператор, с помощью которого можно удалить одну или много строк в таблице, или много строк во многих таблицах… главное – не слишком увлекаться :) 

&lt;br&gt;
&lt;h4&gt;

Удаление строк&lt;/h4&gt;
Удаление строк более простая операция чем все остальные в DML, по большому счету, все сказанное относительно &lt;a href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-dml-update.html&quot; target=&quot;_blank&quot; title=&quot;Основы SQL – DML – UPDATE&quot;&gt;UPDATE&lt;/a&gt; применимо и к DELETE, с той лишь разницей, что данные удаляются, а не модифицируются, и синтаксис немного другой:&lt;br&gt;
&lt;div class=&quot;csharpcode-wrapper&quot; id=&quot;codeSnippetWrapper&quot;&gt;
&lt;pre class=&quot;csharpcode&quot; id=&quot;codeSnippet&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;DELETE&lt;/span&gt; Phones &lt;span class=&quot;kwrd&quot;&gt;WHERE&lt;/span&gt; PersonID = 1 &lt;span class=&quot;kwrd&quot;&gt;AND&lt;/span&gt; Phone = &lt;span class=&quot;str&quot;&gt;&amp;#39;100-1&amp;#39;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
В этом примере происходит удаление одной строки (если такая есть), потому что, как вы помните, “PersonID” и “Phone” являются составным первичным ключом. 

&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-dml-delete.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/1575947018749835769/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/01/osnovy-sql-dml-delete.html#comment-form' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/1575947018749835769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/1575947018749835769'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/01/osnovy-sql-dml-delete.html' title='Основы SQL – DML – DELETE'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7309184816634381248.post-6681174143770654820</id><published>2011-01-27T23:09:00.005+03:00</published><updated>2011-03-29T23:20:16.429+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DML"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SqlIntro"/><title type='text'>Основы SQL – DML – UPDATE</title><content type='html'>Продолжаю серию статей “Основы SQL”. В предыдущих сериях:

&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-pervoe-znakomstvo.html&quot; target=&quot;_blank&quot; title=&quot;Основы SQL - первое знакомство&quot;&gt;Первое знакомство&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-ddl-i-refaktoring-bd.html&quot; target=&quot;_blank&quot; title=&quot;Основы SQL - DDL и рефакторинг БД&quot;&gt;DDL и рефакторинг БД&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-dml-insert-i-drugie.html&quot; target=&quot;_blank&quot; title=&quot;Основы SQL – DML – INSERT и другие&quot;&gt;DML – INSERT и другие&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
В прошлый раз я немного рассказал про оператор INSERT (куда же без него – без первоначальных данных применять остальные операторы DML не имеет смысла).

&lt;br&gt;
Сейчас речь пойдет про UPDATE – оператор, позволяющий модифицировать существующие данные.

&lt;br&gt;
&lt;h4&gt;

Модификация одной строки&lt;/h4&gt;
Если для оператора INSERT существует разный синтаксис для вставки одной строки и множества строк, то для UPDATE синтаксис одинаковый и в простейшем случае выглядит так:&lt;br&gt;
&lt;div class=&quot;csharpcode-wrapper&quot; id=&quot;codeSnippetWrapper&quot;&gt;
&lt;pre class=&quot;csharpcode&quot; id=&quot;codeSnippet&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;UPDATE&lt;/span&gt; Persons &lt;span class=&quot;kwrd&quot;&gt;SET&lt;/span&gt; LastName = &lt;span class=&quot;str&quot;&gt;&amp;#39;Петров&amp;#39;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;WHERE&lt;/span&gt; PersonID = 1&lt;/pre&gt;
&lt;pre class=&quot;csharpcode&quot; id=&quot;codeSnippet&quot;&gt;&lt;/pre&gt;&lt;/div&gt;&lt;a href=&quot;http://www.olegaxenow.com/2011/01/osnovy-sql-dml-update.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.olegaxenow.com/feeds/6681174143770654820/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.olegaxenow.com/2011/01/osnovy-sql-dml-update.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6681174143770654820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7309184816634381248/posts/default/6681174143770654820'/><link rel='alternate' type='text/html' href='http://www.olegaxenow.com/2011/01/osnovy-sql-dml-update.html' title='Основы SQL – DML – UPDATE'/><author><name>Олег Аксёнов</name><uri>http://www.blogger.com/profile/04146413181790640824</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCSzB66KaKDhMpEPql_kOsWQ0449gE2zmhmU_lVbrpUIfRXvz2bsExgDMFBSustvGEvuiRWxs9ptAEBVb5Rvgsfv3yTw1rAs4nty_nPNBI6L_zpGeVNl2548zwJEyjQ/s113/OlegAxenow-256x256.png'/></author><thr:total>0</thr:total></entry></feed>