Вынести SELECT на сторону сервера
От: Аноним  
Дата: 02.01.11 13:09
Оценка:
Есть 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'ом при (де)регистрации сборки автоматически?

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.