среда, 15 декабря 2010 г.

Object Reflection Helper

Please, be polite to this article, because it's only example and experiment, for production ready solution we have to measure different velocity and productivity values.

I have created helper, that cache object properties retrieved with reflection. Also helper provide wrapped methods for setting and getting values of properties, that arranged in dictionary with property name as key.
Let's look on ReflectionUtil class, it really do caching job on static level:

public static class ReflectionUtil<T>
    static ReflectionUtil()
        Properties = typeof (T).GetProperties();
        GetProperties = Properties.Select(_ => new
                                                             Func = GetGetFunc(_), 
            .Where(_ => _.Func != null)
            .ToDictionary(_ => _.Name, _ => _.Func);
        SetProperties = Properties.Select(_ => new
                                                             Func = GetSetFunc(_), 
            .Where(_ => _.Func != null)
            .ToDictionary(_ => _.Name, _ => _.Func);

    public static Func<T, object> GetGetFunc(PropertyInfo propertyInfo)
        MethodInfo methodInfo = propertyInfo.GetGetMethod();
        if (methodInfo != null)
            return  _ => methodInfo.Invoke(_, ArrayUtil.Empty<object>());

        return null;

    public static Func<T, object, T> GetSetFunc(PropertyInfo propertyInfo)
        MethodInfo methodInfo = propertyInfo.GetSetMethod();
        if (methodInfo != null)
            return delegate(T _, object val)
                           methodInfo.Invoke(_, new[] {val});
                           return _;

        return null;

    public static Dictionary<string, Func<T, object>> GetProperties { get; private set; }

    public static Dictionary<string, Func<T, object, T>> SetProperties { get; private set; }

    public static PropertyInfo[] Properties { get; private set; }

One note about code, I extensively use great OSS Lokad Shared Library and class ArrayUtil is from it.
Using this caching can give us some small worth of speeding up iterating over properties of common object and give the ability to lookup through properties using dictionary.

This code snippet help to integrate our reflection utility helper to object pipeline using extension methods syntax.
public static class ObjectReflectionExtension
    public static Dictionary<string, Func<T, object>> GetProperties<T>(this T value)
        return ReflectionUtil<T>.GetProperties;

    public static Dictionary<string, Func<T, object, T>> SetProperties<T>(this T value)
        return ReflectionUtil<T>.SetProperties;

    public static PropertyInfo[] Properties<T>(this T value)
        return ReflectionUtil<T>.Properties;

This helper I will use in the next article with real world code examples. We can extend ReflectionUtil class for caching another .NET members of object, e.g. methods, events, etc...
Quick example to show how typically we can use helper class and get properties from cache storage. First, we retrieve getters and setters from source object fromObj and destination object toObj:

var getProperties = fromObj.GetProperties();
var setProperties = toObj.SetProperties();

Then, we join different types of accessors by name using simple LINQ expression:

var map = from getProp in getProperties
          join setProp in setProperties on getProp.Key equals setProp.Key
          select new { From = getProp.Value, To = setProp.Value };

In the last expression we simply copied all properties values from source object to destination object, of course those objects have to have properties with the same names, if you would like to see any result. In such manner we can implement very simple shallow clone pattern, because of his reflection nature it can be used for any object type.

            _ => _.To(toObj, _.From(fromObj) )

As usually when we using reflection, it is a big question about performance of that type operations, right now we left benchmark out of are of this article, in the next article I will show how to try to accomplish simple object mapper with the help of ReflectionUtil helper, and how to control object mapping in narrow places.
It will be a set of articles, where I will experiment around different aspects of technical implementation CQRS concept in enterprise software. I find interesting article by David Ebbo about interesting solution using the latest .NET 4.0 dynamic object features.
Find enough clever things to say, and you're a Prime Minister; write them down and you're a Shakespeare.
George Bernard Shaw

пятница, 29 октября 2010 г.

Enable CLR Integration in MS SQL Server

This tip can be useless especially in 2010 years, because developers can use SQL CLR during 5+ years and they have already known this procedure, so this tip is more for me, because every time I start using SQL CLR I search for clear script that enables this feature in MS SQL Server 2005/2008.
By default this feature is disabled in effort to security and some performance. Next code will solve this issue:
EXEC sp_configure 'show advanced options' , '1'
EXEC sp_configure 'clr enabled' , '1'
-- turn back advanced options
EXEC sp_configure 'show advanced options' , '0'
After we can write any user-defined functions aggregates, stored procedures, etc...using high versatile and flexible .NET Framework infrastructure in C# or VB.NET.

Typically, I use this feature to accomplish goals of adding Regular Expression support in MS SQL Server. Useful article CLR Assembly RegEx Functions for SQL Server by Example is written by @Phil_Factor.
That's all for today. If you don't mind my dear reader, I will post short tips for myself from time to time, maybe you also find them useful in some cases.

четверг, 30 сентября 2010 г.

Auto-completing geoinformation service

When I started to look into the theme of open source and contributing to the IT world, I had thought about really useful program or library, but after that I decided that it will be waste of time. Taking into account my life style, I won't support this project after some initial time and it will be broken as many other infamous attempts (we can even look on strange life cycle of a great product of Google - Google Wave, that ended after two months in production).
My goal is to provide a small kernel, full cycle of supporting and development of this project without deeply digging into the subject. My choice has become a service. You can ask what the logical difference between producing a program and service? From the program code point of view it is the same operators and conditions, but they give different results to the end user and according to the type of service they can meant for really different end users. Service provides some additional capabilities and very often expands another program product. From the another side, program is completed product that helps end user to do some actions and receive expected results. Of course all my previous thoughts are nothing but philosophy, and they had been running through my head.

Now, let's look into the main goal of this service and why I have chosen exactly this type of service. I want to share useful and commonly used part or subsystem and help developers to make the part of the program faster. What do we see in all types of programs and interfaces? My idea is that it's geoinformation data. Obviously we have systems that don't use any geoinformation and give us great value without it, but the number of program products use it in different approaches and structures.
So, now we have two main questions: will the geoinformational service be used and what type of service will it be?
We can divide it using different criterias, but I will look at three of them: detalisation, validity and sources of retrieving.
By detalisation that is often uses we mean coordinates using longitude and latitude, up to street and house, up to flat and up to city.
Under validity I mean - compliance with the real naming, object hierarchy or privacy and policy.
Sources are in many cases databases that consist of dictionaries or hierarchy structures of objects and places associated with them. Many additional information could be attached to geo objects. These databases could be local, distributed or service oriented. Services provide some API for information search and give quick answer to your problem, they can be filled with data and supported on demand or in contract way. Service takes care of all details of storing these big amounts of information maintenance and accessibility. So we come to the concept of SaaS, that have got new breath after fast growth cloud technologies and especially services.
Next, I will concentrate on implementing simple, lightweight geo web service, with detalisation up to city, that will use RESTfull interface or standard SOAP interface for communication with the clients.
My service will provide simple information:
  • list of all countries in the Earth (with future plans to support new Moon's settlements)
  • list of all cities in specified country
  • additional information about states, provinces, districts or regions and also list of the corresponding cities
  • autocomplete tips that help to input information and names.
In my case I will use different heterogeneous sources like free databases, subqueries to web mapping services and collect any feedback from consumers or clients. May be I will implement self education module, that will try to collect data from queries and add unknown information to the local information storage.
I chose so high detalisation level because of the lack of big resources storing bigger amount of information, and of course because of growing complexity of the service with growing of detalisation level.

Some technical notes, I plan to use .NET platform, MS SQL Server, WCF, git and some library for creating REST interface. Right now I see three candidates RestMvc, RestCake or Simply Restful Routing from the MvcContrib.
I will notify in next post about details and process of contributing and organization of this project.
All feedback and participating is welcome!

понедельник, 27 сентября 2010 г.

Устанавливаем SyntaxHighlighter 3 для Blogger/Blogspot

При написании статьи у меня возникла потребность в подсвечивании синтаксиса кода. Самый удобный и распространенный способ, это использовать библиотеку Alex Gorbatchev - SyntaxHighlighter. Основываясь на предыдущих успешных установках этой библиотеки для движка блогов Blogger, я принялся за дело и по пути, конечно, решил использовать одну из последних усовершенствований - автозагрузку различных кистей. Следую примеру интеграции, а они все следует сказать, достаточно старые и основываясь на обновленной wiki, я сразу не смог получить результат.
Пример из wiki насторек SyntaxHighlighter для Blogger не заработал.
Привожу краткий результат какие необходимы шаги для успешной интеграции SyntaxHighlighter 3 и Blogger:
  1. Скачиваем  последнюю версию библиотеки, это конечно лишает нас возможности автоматического обновления, что было бы доступно при использовании размещенной версии, но я несколько раз получал отказ в доступе к ресурсам размещенных на сервере Amazon S3, поэтому решил использовать собственный хостинг
  2. Заливаем на наш хостинг содержимое папок Scripts и Styles, особенно удобно если у вас подключен дополнительный псевдоним для недоступного контента на Blogger, это можно сделать в настройках Settings->Publishing->Missing files host, тогда заливая на этот хост, мы можем ссылаться на файлы, как будто они размещены на основном домене блога.
  3. Редактируем шаблон сайта и перед закрывающимся тэгом </head> вставляем ссылки

    <link href='/syntaxhighlighter/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
    <link href='/syntaxhighlighter/styles/shCore.css' rel='stylesheet' type='text/css'/>
    <script src='/syntaxhighlighter/scripts/shCore.js' type='text/javascript'/>
    <script src='/syntaxhighlighter/scripts/shAutoloader.js' type='text/javascript'/>
    У меня выделена папка syntaxhighlighter для всех файлов библиотеки.
  4. В конце шаблона сайта перед закрывающим тэгом </body> вставляем код немного отредактированный мной:

    <script type='text/javascript'>
    function path()
      var args = arguments, result = [];
      for(var i = 0; i < args.length; i++)
          result.push(args[i].replace('@', '/syntaxhighlighter/scripts/'));
      return result;
    SyntaxHighlighter.autoloader.apply(null, path(
      'applescript            @shBrushAppleScript.js',
      'actionscript3 as3      @shBrushAS3.js',
      'bash shell             @shBrushBash.js',
      'coldfusion cf          @shBrushColdFusion.js',
      'cpp c                  @shBrushCpp.js',
      'c# c-sharp csharp      @shBrushCSharp.js',
      'css                    @shBrushCss.js',
      'delphi pascal          @shBrushDelphi.js',
      'diff patch pas         @shBrushDiff.js',
      'erl erlang             @shBrushErlang.js',
      'groovy                 @shBrushGroovy.js',
      'java                   @shBrushJava.js',
      'jfx javafx             @shBrushJavaFX.js',
      'js jscript javascript  @shBrushJScript.js',
      'perl pl                @shBrushPerl.js',
      'php                    @shBrushPhp.js',
      'text plain             @shBrushPlain.js',
      'py python              @shBrushPython.js',
      'ruby rails ror rb      @shBrushRuby.js',
      'sass scss              @shBrushSass.js',
      'scala                  @shBrushScala.js',
      'sql                    @shBrushSql.js',
      'vb vbnet               @shBrushVb.js',
      'xml xhtml xslt html    @shBrushXml.js'
    SyntaxHighlighter.config.bloggerMode = true;
Теперь у нас настроена автоматическая подсветка синтаксиса и доступна дополнительная конфигурация

понедельник, 16 августа 2010 г.

Research Project with .NET technology stack and tools

Сегодня после долгого размышления собрался написать приложение, которое будет решать две проблемы.
Первая - это некоторая небольшая задача, предположим планирования расписания различных календарных событий, к примеру распределение пациентов и запись их на прием к доктору. Клиенту предоставляется удобный интерфейс для выбора подходящего времени. Доктор же может предварительно и оперативно выбрать доступные даты и временные промежутки, а также получить конечное сформированное расписание приема пациентов. Ориентация проблематики не ограничивается конкретной задачей доктора и пациентов, а рассматривает обобщенную задачу календарного планирования. Приложение будет иметь несколько версий и стадий, в первом приближении это будет очень упрощенная версия, но в которой будет заложена и реализована основная архитектура и доменная модель.
Вторая цель - это на практике использовать различные библиотеки, технологии и архитектуру. Редко когда проект на работе позволяет полностью использовать все возможности, которые есть на сегодня технологий, т.к. всегда есть различные ограничения, объективные и не очень.
К сожалению  проекты часто преследует железный треугольник и в сроки тяжело вписать изучение технологий, который не относятся непосредственно к проектным нуждам.

The Project Management Triangle (called also Triple Constraint) is a model of the constraints of project management. It is often used to illustrate that project management success is measured by the project team's ability to manage the project, so that the expected results are produced while managing time and cost.

Michael W. Newell, Marina N. Grashina (2004). The Project Management Question and Answer Book

Поэтому я и попробую создать некоторый абстрактный проект для углубления знаний, которые хочу получить, но нет возможности в рабочее время.
Кратко рассмотрим библиотеки и технологии, которые буду изучать и использовать:
  1. .NET Framework 4.0 - хочется рассмотреть реальное применение динамических возможностей нового FW.
  2. ASP.NET MVC 2 - конечно на подходе уже Preview MVC 3, но есть удобные вещи, которые хотелось бы попробовать, к примеру Model Annotations, хотя видимо придется использовать пример Brad Wilson для серверной валидации через Ajax.
  3. Lokad Shared Libraries - великолепный набор, простых и удобных расширений и средств (спасибо Ринат и команда).
  4. SpecFlow - Cucumber для .NET, а если быть точным, то расширение для Visual Studio.
  5. Autofac - IoC контейнер, благодаря некоторым великолепным надстройкам и интеграции с различными системами хорошо зарекомендовал себя в моих проектах, постараюсь расширить знания о последних версиях и поделиться опытом.
  6. Moq - библиотека для создания заглушек, для тестирования и прототипирования.
  7. Nunit - кто не знает nunit, тот скорей всего никогда не писал Unit тестов в .NET (да простят меня приверженцы MbUnit).
  8. Git - код буду хранить в Git репозитории, посмотрим, действительно ли так легко и удобно работать с branch системой в нем, в отличии от svn.
Вот, основной, далеко не полный список библиотек, которые предполагаю использовать, видимо в процессе появятся, а возможно и поменяются некоторые. Весь процесс создания я постараюсь подробно описать.

четверг, 22 апреля 2010 г.

Rebuild All Index in Database Sql Server – 2005 - 2008 with FillFactor

Так складывется, что основная моя работа не связана с тонкой настройкой базы данных и даже в некотором смысле это не самое мое сильное место в информационных технологиях. Но самые интересные для меня вопросы попадаются из сферы баз данных и СУБД.
Сегодня рассмотрим несложный SQL скрипт для перестройки всех индексов в базе данных:
USE DatabaseName
DECLARE @fillFactor int
-- configuration set fillfactor for indexes
SET    @fillFactor = 90
SELECT OBJECT_SCHEMA_NAME([object_id])+'.'+name FROM sys.tables
WHERE type_desc = 'USER_TABLE'
DECLARE @tableCount int
DECLARE @tableName VARCHAR(128)
SELECT @tableCount = COUNT(*) FROM @dbTables
WHILE (@tableCount>0)
SELECT TOP 1 @tableName = TABLE_NAME from @dbTables
SET @sql = 'ALTER INDEX ALL ON ' + @tableName + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillFactor) + ')'
PRINT @sql
SET @tableCount=@tableCount-1
--fix some configuration issue
sp_configure 'show advanced options', 1
sp_configure 'fill factor', 90
Иногда происходит ошибка описанная Pinal Dave для ее решения можно использовать закомментированный T-SQL код.
Естественно что использовать данную процедуру необходимо производить осторожно, так как это вызывает дополнительную (иногда не слабую) нагрузку на сервер. Также иногда необходима тонкая настройка индексов с учетом FILLFACTOR, DATA_COMPRESSION, etc.

SQL скрипт - Rebuild All Index in Database 2005-2008

среда, 24 марта 2010 г.

ASP.NET Dynamic Data: Custom Page Specialize Model And Action

ASP.NET Dynamic Data позволяет производить достаточно точную конфигурацию страниц и редакторов для полей редактируемой сущности. На сегодня в поставку входят контексты Linq2Sql и Entity Framework.
Я остановлюсь на небольшом уточнении в конфигурации шаблона страницы для редактирования выбранной таблицы по определенному действию. Переопределить шаблоны для всех действий по конкретной таблицы можно при помощи route регистрируемого при старте приложения в Global.asax:

routes.Add(new DynamicDataRoute("Products/{action}.aspx")
    Table = "Products",
    ViewName = "ProductList",
    Model = model
В DynamicDataRoute классе есть public свойство Action, на первый взгляд оно должно ограничивать определенный route по конкретному дейстию, но это не так и чтобы сделать такое ограничение надо по-прежнему использовать ограничения Constraints:
routes.Add(new DynamicDataRoute("Products/{action}.aspx")
    Table = "Products",
    ViewName = "ProductList",
    Model = model,
    Constraints = new RouteValueDictionary(new { action = PageAction.List }),

Комбинация таких выражений позволяет тонко настраивать отображаемые страницы для конкретных моделей таблиц, функциональность которых должна быть изменена, по отношению к стандартным шаблонам.
Собственные шаблоны страниц должны размещаться в папке с именем таблицы дочерней папке ~/DynamicData/CustomPages. Из примера выше это должен быть шаблон ~/DynamicData/CustomPages/Products/ProductList.aspx.
В следующих постах я расскажу о расширении ASP.NET Dynamic Data Filtering и возможности использования Dynamic Data Controls в обычном front-end приложении.

Ссылки по теме:
ASP.NET Dynamic Data
Dynamic Data Model Overview

четверг, 18 февраля 2010 г.

Сто лет Одиночества - Предсмертное письмо Габриэля Гарсии Маркеса (Завещание)

Аудио mp3 (6,724 KB)

Проси у Господа мудрости и силы...

Если бы на одно мгновение Бог забыл, что я всего лишь тряпичная марионетка, и подарил бы мне кусочек жизни, я бы тогда, наверно, не говорил всё, что думаю, но точно бы думал, что говорю. Я бы ценил вещи, не за то сколько они стоят, но за то, сколько они значат. Я бы спал меньше, больше бы мечтал, понимая, что каждую минуту когда мы закрываем глаза, мы теряем шестьдесят секунд света. Я бы шёл, пока все остальные стоят, не спал, пока другие спят. Я бы слушал, когда другие говорят, и как бы я наслаждался чудесным вкусом шоколадного мороженного.

Если бы Бог одарил меня ещё одним мгновением жизни, я бы одевался скромнее, валялся бы на солнце, подставив тёплым лучам не только моё тело, но и душу. Господь, если бы у меня было сердце, я бы написал всю свою ненависть ко льду и ждал пока выйдет солнце. Я бы нарисовал мечтой Ван Гога на звёздах поэму Бенедетти, и песня Серрат стала бы серенадой, которую я бы подарил Луне. Я бы полил слезами розы, чтобы почувствовать боль их шипов и алый поцелуй их лепестков...

Господь, если бы у меня ещё оставался кусочек жизни, я бы не провёл ни одного дня, не сказав людям, которых я люблю, что я их люблю. Я бы убедил каждого дорогого мне человека в моей любви и жил бы влюбленный в любовь. Я бы объяснил тем, которые заблуждаются, считая, что перестают влюбляться, когда стареют, не понимая, что стареют, когда перестают влюбляться!
Ребёнку я бы подарил крылья, но позволил ему самому научиться летать. Стариков я бы убедил в том, что смерть приходит не со старостью, но с забвением. Я столькому научился у вас, люди, я понял, что весь мир хочет жить в горах, не понимая, что настоящее счастье в том, как мы поднимаемся в гору.

Я понял, что с того момента, когда впервые новорожденный младенец сожмёт в своем маленьком кулачке палец отца, он его больше никогда его не отпустит. Я понял, что один человек имеет право смотреть на другого свысока только тогда, когда он помогает ему подняться. Есть столько вещей, которым я бы мог ещё научиться у вас, люди, но, на самом-то деле, они вряд ли пригодятся, потому что, когда меня положат в этот чемодан, я, к сожалению, уже буду мёртв. Всегда говори то, что чувствуешь, и делай, то что думаешь.

Если бы я знал, что сегодня я в последний раз вижу тебя спящей, я бы крепко обнял тебя и молился Богу, чтобы он сделал меня твоим ангелом-хранителем. Если бы я знал, что сегодня вижу в последний раз, как ты выходишь из дверей, я бы обнял, поцеловал бы тебя и позвал бы снова, чтобы дать тебе больше. Если бы я знал, что слышу твой голос в последний раз, я бы записал на плёнку всё, что ты скажешь, чтобы слушать это ещё и ещё, бесконечно. Если бы я знал, что это последние минуты, когда я вижу тебя, я бы сказал: Я люблю тебя и не предполагал, глупец, что ты это и так знаешь. Всегда есть завтра, и жизнь предоставляет нам ещё одну возможность, чтобы всё исправить, но если я ошибаюсь и сегодня это всё, что нам осталось, я бы хотел сказать тебе, как сильно я тебя люблю, и что никогда тебя не забуду. Ни юноша, ни старик не может быть уверен, что для него наступит завтра.

Сегодня, может быть, последний раз, когда ты видишь тех, кого любишь. Поэтому не жди чего-то, сделай это сегодня, так как если завтра не придёт никогда, ты будешь сожалеть о том дне, когда у тебя не нашлось времени для одной улыбки, одного объятия, одного поцелуя, и когда ты был слишком занят, чтобы выполнить последнее желание.

Поддерживай близких тебе людей, шепчи им на ухо, как они тебе нужны, люби их и обращайся с ними бережно, найди время для того, чтобы сказать: "мне жаль", "прости меня, пожалуйста" и "спасибо", и все те слова любви, которые ты знаешь. Никто не запомнит тебя за твои мысли.
Проси у Господа мудрости и силы, чтобы говорить о том, что чувствуешь. Покажи твоим друзьям, как они важны для тебя. Если ты не скажешь этого сегодня, завтра будет таким же как вчера. И если ты этого не сделаешь никогда, ничто не будет иметь значения. Воплоти свои мечты. Это мгновение пришло.

P.S. Понравилось и захотелось провести эксперимент, насколько можно подняться в поисковом рейтинге по тематике несвойственной для всего блога.

четверг, 4 февраля 2010 г.

Размышления о чем писать далее

Интересно, чтобы такого написать чтобы не противоречило интеллектуальной собственности компании, в которой я работаю. Напишу наверное о собеседованиях и интересных моментах связанных с их проведением.
Хмм, пришла мысль, а могу ли я указывать название компании в которой я работаю.
Просто недавно, в связи с тем что я написал пост в корпоративный блог компании, но перед этим опубликовал в своем блоге его вариант, но на русском языке, потом пришлось его удалить, по просьбе компании. Вышла странная путаница, с одной стороны я и компанию в чем-то понимаю, с другой, тут нет ничего противоречащего интеллектуальной собственности, написал разместил - другой язык, практически, перевод поста, мог бы разместить ссылку на корпоративный блог.
Вот многие geeks из, к примеру Microsoft или Yandex, пишут в свои блоги мысли и размышления о технологиях, которые используют в рабочее время и это только повышает авторитет фирмы. Компания сильна своими сотрудниками!
Принял 2 важных решения:
  1. Больше в корпоративный блог писать не буду, дабы не было никаких вопросов.
  2. Расскажу чуть позже, когда будет конкретная информация.

P.S. Интересно будет ли кто-то проверять удалил ли я пост из своего блога)))

среда, 13 января 2010 г.

Set connection limit for MS SQL Server using TSQL

Сегодня предлагаю небольшой TSQL скрипт для установки максимального числа одновременных клиентский соединений для MS SQL Server.

SELECT * FROM sys.configurations
where description like '%connection%'

sp_configure 'show advanced options', 1;

exec sp_configure 'user connections', 0;


sp_configure 'show advanced options', 0;

После рестартовать SQL Server.

Используя SQL Server Management Studio:

  1. В обозревателе объектов щелкните правой кнопкой мыши на сервере и выберите Свойства.

  2. Выбрать закладку подключения.

  3. В соединениях, в поле Мах число одновременных подключений введите или выберите значение от 0 до 32767 для установки максимального количества пользователей, которым разрешено одновременное подключение к экземпляру SQL Server.

  4. Перезапустите SQL Server.

пятница, 8 января 2010 г.

MS Sql Server error with computed column

Здравствуйте, меня зовут Почепцов Вячеслав и сегодня я начну серию технических постов, связанных с различными аспектами разработки и способных помочь людям, которые столкнуться с подобными проблемами или размышлениями.
Сейчас я занимаюсь разработкой высоконагруженного сайта LiquidGeneration, написанного моей командой на ASP.NET MVC 1.0, IIS 7.0, Windows 2008, MS Sql Server 2005.
Сегодня рассмотрим простую ситуацию в MS Sql Server 2005, которая вызывает ошибку
Internal Query Processor Error: The query processor could not produce a query plan. For more information, contact Customer Support Services.
USE [master]

-- SET ANSI_PADDING that preferred on Sql Server 2005+

-- drop databse if it already exists
IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'test')


USE [test]

[ID] [int] NOT NULL,
[SOME_FIELD] [nvarchar](40) NOT NULL

-- create table with computed field. it's important!
[ID] [int] NOT NULL,
[NAME] [nvarchar](40) NOT NULL,
[COMPUTED_FIELD]  AS (replace([NAME],' ','_')) PERSISTED,

--create foreign key constraint

-- insert some data into tables
-- to verify that insert operation works well
SELECT 1, 'bill'
SELECT 2, 'john'
SELECT 3, 'jett'

SELECT 1, 'test1'
SELECT 2, 'test2'
SELECT 3, 'test3'

-- create stored procedure that perform the same insert that previous sql command
-- it use child table that has foreign key to parent table with computed field
CREATE PROCEDURE [dbo].[sp_InsertIntoChild]
SELECT 3, 'test4'

-- set padding off - it's default settings for connections from DB-Library applications

-- run stored procedure
EXEC    [dbo].[sp_InsertIntoChild]


Исправить проблему можно достаточно просто установив SET ANSI_PADDING ON, но при вызове из приложения при создании соединения установить это невозможно.

Ошибка обрабатывается специалистами Microsoft, обещали исправить.

Sql cкипрт