Пишет Михаил Ксенофонтов
За 2 года работы программистом баз данных MS SQL у меня накопился некоторый перечень запросов, которые могут оказаться полезными в ежедневной работе. Некоторыми из этих запросов я собираюсь поделиться с вами в данной статье.
Поиск
Приведенный ниже запрос я использую ежедневно для поиска упоминаний объектов среди кода хранимых процедур:
SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules AS sm
WHERE sm.definition LIKE '%filter%'
Или, если нам нужно найти код, который находится внутри джоба:
SELECT j.name, step_name
FROM msdb..sysjobs AS j
JOIN msdb..sysjobsteps AS js
ON j.job_id = js.job_id
WHERE command LIKE '%filter%'
Отладка
Часто возникает ситуация, когда необходимо выполнить хранимую процедуру, чтобы проверить корректность ее работы, при этом необходимо, чтобы этот вызов не изменил никаких реальных данных.
В таких случаях можно обернуть вызов процедуры и запросы для проверки данных в одну транзакцию с отменой изменений в конце. Вполне очевидное решение, но не каждый начинающий программист об этом догадывается:
BEGIN TRAN
DECLARE @id INT = 10;
-- Вызов процедуры, которая изменяет реальные данные
EXEC dbo.spDoSomething @param1 = @id;
-- Проверяем, что реальные данные изменились так, как нам нужно
SELECT *
FROM dbo.tblData
WHERE IdData = @id;
-- Возврат состояния системы в исходное состояние
ROLLBACK
Числовые множества и случайные числа
Для генерации множества «на лету», без использования дополнительных таблиц можно использовать рекурсивные CTE:
-- Пример с генерацией чисел от 1 до 100
WITH cte
AS
(
SELECT Number = 1
UNION ALL
SELECT Number = Number + 1
FROM cte
WHERE Number < 100
)
SELECT *
FROM cte
А для генерации случайных чисел или сортировки строк в случайном порядке можно использовать стандартную функцию NEWID():
-- Генерация случайных чисел
SELECT CHECKSUM(NEWID())
-- Генерация случайного числа от 0 до 100
SELECT ABS(CHECKSUM(NEWID())) % 101
-- Сортировка данных в случайном порядке
SELECT *
FROM tblGoods
ORDER BY NEWID()
В полной версии статьи на Tproger.ru читайте о запросах, которые помогают передавать табличные данные и создавать агрегацию в разрезе строк.
На этом все. Надеюсь, среди читателей найдутся те, кто открыл для себя что-то новое в этой статье.