Есть SqlClr-триггер. И образовался у меня в этом триггере достаточно большой и сложный SELECT, с кусками типа:
(CASE WHEN EXISTS(SELECT * FROM INSERTED I WHERE I.ID = R.ID) THEN '1' ELSE '0' END) AS IsUpdated -- Выбираемая строка была только что добавлена?
а также всякими JOIN'ами. Ибо мне удобно получить ровно одну таблицу-отчет со всеми колонками.
Вопрос 1. Можно или нет вынести этот SELECT на сторону сервера? Если да, то как?
Я имею в виду сделать какую-нибудь хранимую процедуру, или функцию, или еще что-то, что поддерживает SQL Server 2005/8, и вызывать эту сущность, а потом читать в цикле датасет.
Два последующих вопроса имеют смысл только если ответ на первый вопрос утвердительный.
Почему я хочу так сделать — во-первых, мне не нравится держать много SQL-кода среди C#-кода. Во-вторых, я полагаю, что если код вынести на сервер, он будет выполняться быстрее, ибо SQL Server сможет понять, что надо закешировать такой запрос, а если он каждый раз будет получать его заново, то не факт.
Вопрос 2. Прав ли я? Ускорит ли это работу?
Кроме того, в моем SELECT'е содержатся константные строки, но они языкозависимые. То есть, в русской версии это ...WHERE R.Status = "Включено"..., а в английской — ...WHERE R.Status = "Enabled"... Сейчас у меня все локализуемое хранится в ресурсах. Поэтому, план такой: создать в SqlClr-триггере два статических метода, назвать их OnCreate и OnDestroy и пометить как хранимки. При регистрации/дерегистрации сборки на сервере инсталлятором вызывать хранимку, соответствующую первому или второму методу соответственно. Внутри OnCreate создавать SELECT и подставлять вместо {0},{1}... нужные константы из ресурсов, а потом все выражение "выносить" на сервер. Тогда локализовать можно будет исключительно ресурсы, про остальное забыть.
Далее, такие вещи как псевдоколонка IsUpdated копипастятся — один раз указаны в скрипте (AS IsUpdated), второй раз — при чтении ((int)reader["IsUpdated"]). Это плохо. Можно их вынести тоже в ресурсы, тогда копипаста исчезнет.
Вопрос 3. Хорошо ли это придумана стратегия локализации? Есть ли готовый атрибут, чтобы помеченные им методы вызывались SQLServer'ом при (де)регистрации сборки автоматически?
Спасибо.