Найти в Дзене
Типичный программист

Топ полезных запросов для MS SQL на каждый день

Оглавление

Пишет Михаил Ксенофонтов

За 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 читайте о запросах, которые помогают передавать табличные данные и создавать агрегацию в разрезе строк.

На этом все. Надеюсь, среди читателей найдутся те, кто открыл для себя что-то новое в этой статье.