На этой странице расположилась постоянно пополняемая библиотека исходных кодов на языке T-SQL (так же известных как «сниппеты», потому что каждый из них мал по объему и решает одну конкретную проблему). Каждый сниппет в обязательном порядке снабжен объемным комментарием объясняющим его назначение и дающий примеры входных/выходных значений. Сниппеты объединены в группы по функциональному назначению, см. блок «Быстрая навигация» чуть ниже. Все представленные здесь коды являются абсолютно free и вы можете использовать их в личных и производственных задачах совершенно свободно. Если же вы хотите сослаться на тот или иной сниппет в своем форуме, блоге, ином публичном ресурсе — пожалуйста, используйте постоянную ссылку на заинтересовавший вас сниппет (она известна как Permalink). Permalink показывается и может быть скопирован из заголовка окна просмотра полного текста каждого сниппета.
Следует заметить, что код сниппетов по умолчанию оптимизируется (и в обязательном порядке тестируется) под последнюю релиз-версию MS SQL Server. Работоспособность кода на предыдущих версиях сервера более чем вероятна, но не гарантируется — проверяйте!
Высказать замечание, предложить улучшение или даже замену тому или иному сниппету можно через страницу Контакт.
Итак, как говорится: «кодируйте с нами — кодируйте лучше нас». :)
Быстрая навигация
Работа с датами и временем | Работа со строками | Мониторинг/аудит | Алгоритмы и вероятности |
Группировка/расщепление данных | Изменение данных | Отладка/тестирование | Управление сервером |
Транзакции и сессии |
Работа с датами и временем
Узнать первый и последний день месяца заданной даты
У нас имеется определенная дата. Сформировать две строки:▲ к быстрой навигации
-строку представляющую первый день того же месяца
-строку представляющую последний день того же месяцаУзнать для данного дня следующий РАБОЧИЙ
Для данной даты вычислить ближайший рабочий день, при этом:▲ к быстрой навигации
-Пнд.-Пт. - рабочие дни, КРОМЕ отмеченных в спецтаблице
-Суб.,Вск. - выходные, КРОМЕ отмеченных в спецтаблицеУзнать сколько РАБОЧИХ дней между двумя датами
Для двух дат вычислить разницу БЕЗ учета выходных и▲ к быстрой навигации
праздников и при этом:
-Пнд.-Пт. - рабочие дни, КРОМЕ отмеченных в спецтаблице
-Суб.,Вск. - выходные, КРОМЕ отмеченных в спецтаблицеОпределить является ли указанная дата РАБОЧИМ днем
Требуется узнать, приходится ли указанная дата на▲ к быстрой навигации
выходные или праздники, при этом:
-Пнд.-Пт. - рабочие дни, КРОМЕ отмеченных в спецтаблице
-Суб.,Вск. - выходные, КРОМЕ отмеченных в спецтаблицеИз двух символьных колонок составить дату типа datetime
Таблица T состоит из колонок A и B любого символьного типа.▲ к быстрой навигации
Мы знаем что A содержит дату, а B - время, причем дата
всегда указана полностью (8 символов), а время м.б. указано
частично (1-4 символа). Сформировать из каждой пары datetime.
Работа со строками
Сделать первый(и только первый) символ каждого слова в строке прописным
Есть строка состоящая из слов разделенными ПРОБЕЛАМИ(!)▲ к быстрой навигации
Регистр каждой буквы каждого слова произвольный.
Требуется сделать только первую букву каждого слова
заглавной, а остальные - строчными.Очистить строку от лишних пробелов
Лишними пробелами считаются:▲ к быстрой навигации
-все пробелы до первого значащего символа
-все пробелы после последнего значащего символа
-все внутренние пробелы если их 2 и более подрядНайти число вхождений внутренней строки во внешнюю
Есть две строки: "внутренняя" (шаблон) и "внешняя" (база).▲ к быстрой навигации
Найти сколько раз шаблон повторяется в базе.Распарсить строку символов
Имеется строка состоящая из "порций"(chunk). Порции разделены▲ к быстрой навигации
определенным символом. Требуется извлечь каждую порцию и
поместить ее в ячейку таблицы. Если порция имеет лидирующие/
завершающие (но НЕ внутренние!) пробелы - отбросить их.
Мониторинг/аудит
Оценить время выполнения пакета команд
Есть пакет команд (batch), требуется оценить время▲ к быстрой навигации
его исполнения сервером с точностью до миллисекунд.Оценить нагрузку на Disk I/O от каждого файла каждой БД
Требуется узнать, на какую базу данных (и на какой из▲ к быстрой навигации
ее файлов) тратится наибольшее количество операций
чтения/записи с/на дисковую подсистему.Найти самые ресурсозатратные запросы к серверу
Мы хотим видеть - какие запросы нагружают сервер работой▲ к быстрой навигации
сильней всего, сколько раз они запускались, сколько ушло
времени на их исполнение, а так же их T-SQL код
и план исполнения.Оценить размеры таблиц и число строк в них
Для всех таблиц заданной базы вывести число строк(rows) и▲ к быстрой навигации
зарезервированное под каждую таблицу место на диске.
Последний размер дополнительно разбить на: место под данные,
место под индексы и пока не используемое место.Произвести поиск данных во ВСЕХ таблицах данной базы
Требуется найти информацию во всех колонках заданного типа,▲ к быстрой навигации
не важно к какой таблице она относится. Так же необходимо
подсчитать сколько раз искомая информация встретилась в
той или иной колонке.Установить время внесения последних изменений в таблицу
Требуется узнать время внесения последних изменений в данные▲ к быстрой навигации
таблицы (изменения в структуре не считаются, равно как и
запросы оператором SELECT).
Алгоритмы и вероятности
Сгенерировать случайную строку (пароль, ключ) заданной длинны
Мы знаем необходимую длину пароля,минимальный(по ASCII-кодам)▲ к быстрой навигации
символ который может в него войти, максимальный символ и
символы которые в него входить не могут. Нужно сгенерировать
случайный пароль.
Группировка/расщепление данных
Данные одной и той же колонки вывести в разных колонках резалт-сета
Данные содержатся в колонке A таблицы T. Базируясь на▲ к быстрой навигации
значениях колонки B той же таблицы вывести их в
резалт-сете в колонках A1 и A2.Возвращают ли два резалт-сета идентичные данные?
Запросы SELECT1 и SELECT2 различны (по коду) и возвращают два▲ к быстрой навигации
резалт-сета. Мы подозреваем, что данные в обоих идентичны.
Требуется подтвердить/опровергнуть наше подозрение.Вывести значения колонки в строку
Имеется таблица T с колонкой A. Сформировать строку,▲ к быстрой навигации
содержащую все значения из A разделенные, например, запятой.Просуммировать значения колонки по условию
Таблица T содержит колонку A. Требуется просчитать сумму▲ к быстрой навигации
значений в этой колонке, по различным алгоритмам базирующихся
на значение этой или иной колонки той же таблицы. Вывести
результаты просчетов в одном резалт-сете.Объединить значения колонки B по значениям колонки A
Таблица T содержит колонки A и B. Каждая строка B содержит▲ к быстрой навигации
отдельное значение. Требуется вывести каждое уникальное
значение колонки A, а все значения колонки B соответствующие
такому значению A перечислить через запятую.Найти минимальное/максимальное значение в каждой строке
Таблица T содержит числовые колонки A,B,C. Требуется вывести▲ к быстрой навигации
все значения этих колонок и плюс дополнительную колонку
содержащую минимальное/максимальное значение в каждой строке.Найти минимальное/максимальное значение во всей таблице
Таблица T содержит числовые колонки A,B,C. Требуется вывести▲ к быстрой навигации
минимальное/максимальное значение среди всех значений всех
трех колонок, т.е. абсолютный минимум/максимум в границах
всей таблицы.
Изменение данных
Удалить "частичные" дубликаты строк из таблицы
Таблица T состоит из колонок A,B,C. Вы принимаете решение,▲ к быстрой навигации
что строчки таблицы содержащие идентичные значения в
СОЧЕТАНИИ A+C являются дубликатами, B не учитывается.
Требуется оставить по одному экземпляру каждого дубликата.Удалить "полные" дубликаты строк из таблицы
Таблица T состоит из колонок A,B,C. Вы принимаете решение,▲ к быстрой навигации
что строчки таблицы содержащие АБСОЛЮТНО идентичные
значения во ВСЕХ колонках (регистр строк УЧИТЫВАЕТСЯ!)
являются дубликатами. Оставить по одному дубликату.
Отладка/тестирование
Вывести произвольный текст в файл (логирование)
По некоторым причинам(скорее всего отладка кода) вам▲ к быстрой навигации
требуется выводить предопределенный (или динамически
создаваемый) текст в локальный (с т.з. сервера) файл.
Управление сервером
Узнать версию, установленный сервис-пак и редакцию сервера
Для имеющегося сервера(инстанса) выяснить его версию,▲ к быстрой навигации
редакцию, а так же установленные на нем сервис-паки.Сменить значение коллейшена (collation) сервера
Для имеющегося сервера(инстанса) сменить его текущее значение▲ к быстрой навигации
collation на какое либо иное.Найти в логе (Sql Server Log) слово или фразу
В текущем или архивном логе сервера требуется найти▲ к быстрой навигации
некоторую текстовую информацию.Удалить все не-системные объекты из системной БД master
Некоторый скрипт создающий массу пользовательских объектов▲ к быстрой навигации
(таблицы, представления, процедуры и пр.) был ошибочно за-
пущен не в контексте пользовательской базы, а в контексте
БД master. Требуется "почистить" данную системную базу.
Транзакции и сессии
Извлечь значения опций текущей сессии
Каждое отдельное подключение к серверу (сессия) создается с▲ к быстрой навигации
рядом настроек (опций), устанавливаемых оператором SET либо
принимающих значение "по умолчанию" если SET не применялся.
Требуется узнать текущие значения этих опций.