5 полезных запросов для MS SQL
За 2 года работы с MS SQL у меня накопился перечень из 5 запросов: для поиска, отладки, агрегации и обработки множеств и таблиц.
10К открытий10К показов
За 2 года работы программистом баз данных MS SQL у меня накопился некоторый перечень запросов, которые могут оказаться полезными в ежедневной работе. Некоторыми из этих запросов я собираюсь поделиться с вами в данной статье.
Поиск
Приведенный ниже запрос я использую ежедневно для поиска упоминаний объектов среди кода хранимых процедур:
Или, если нам нужно найти код, который находится внутри джоба:
Отладка
Часто возникает ситуация, когда необходимо выполнить хранимую процедуру, чтобы проверить корректность ее работы, при этом необходимо, чтобы этот вызов не изменил никаких реальных данных.
В таких случаях можно обернуть вызов процедуры и запросы для проверки данных в одну транзакцию с отменой изменений в конце. Вполне очевидное решение, но не каждый начинающий программист об этом догадывается:
Числовые множества и случайные числа
Для генерации множества «на лету», без использования дополнительных таблиц можно использовать рекурсивные CTE:
А для генерации случайных чисел или сортировки строк в случайном порядке можно использовать стандартную функцию NEWID():
Передача табличных данных
Иногда перед нами может возникнуть задача, требующая передачи табличных данных из одной процедуры в другую. В случае, когда эти процедуры находятся внутри одной БД, данная задача решается довольно просто. Все, что для этого требуется, это завести новый параметр, возвращающий табличное значение:
Но бывают ситуации, в которых требуется передать табличные данные между серверами, и тогда придется придумывать какой-то другой способ. В случае, когда таковых данных не очень много, я выполняю форматирование данных в виде строки, содержащей данные в формате XML (преобразование в строку нужно т.к. MS SQL не позволяет выполнять удаленный вызов процедур с XML-параметрами):
Агрегация в разрезе строк
Не знаю, как правильно описать то, что я собираюсь продемонстрировать ниже, поэтому приведу пример.
Допустим, у нас есть таблица tblGoods, хранящая информацию о размерах некоторой продукции Size1, Size2, Size3, и нам требуется для каждой строки определить, какое из значений является высотой, иначе говоря, найти наибольшее число среди Size1, Size2, Size3.
Один из вариантов — это использование оператора UNPIVOT, но есть и другой способ, как мне кажется, более наглядный, и в некоторых случаях обладающий большей производительностью (точными данными не обладаю, но в приведенном примере это так, в чем вы можете убедиться самостоятельно).
Этот способ заключается в использовании подзапроса и конструкции SELECT * FROM (VALUES…).
Для начала подготовим тестовые данные:
Пример 1, с использованием оператора UNPIVOT:
Пример 2, с подзапросом:
На этом все. Надеюсь, среди читателей найдутся те, кто открыл для себя что-то новое в этой статье.
10К открытий10К показов