by Alexey Knyazev
21. сентября 2011 02:32
Агрегатные (
статические) функции выполняют вычисление на наборе значений и возвращают одиночное значение. Статистические функции, за исключением COUNT, не учитывают значения NULL. Статистические функции часто используются в выражении GROUP BY инструкции SELECT.
Все статистические функции являются детерминированными. Это означает, что статистические функции возвращают одну и ту же величину при каждом их вызове на одном и том же наборе входных значений. Дополнительные сведения о детерминизме функций см. в разделе
Детерминированные и недетерминированные функции. Предложение
OVER может следовать за всеми статистическими функциями, кроме CHECKSUM.
Статистические функции могут быть использованы в качестве выражений только в следующих случаях.
- Список выбора инструкции SELECT (вложенный или внешний запрос).
- Предложение COMPUTE или COMPUTE BY.
- Предложение HAVING.
Transact-SQL предоставляет следующие статистические функции:
К сожалению это весь список, но что делать, когда нам нужна агрегатная функция, которой нет в T-SQL? В этой статье я покажу, как создать свою агрегатную функцию на примере
побитового OR (Побитовое ИЛИ). Варианты решения будут в виде классического t-sql и в виде CLR-сборки. Кроме демонстрации скриптов, проведу небольшие замеры и сравнения производительности вариантов на t-sql и clr.
[Ещё]
by Alexey Knyazev
18. сентября 2011 00:09
В SQL Server есть ограничение на инструкцию
INSERT EXEC - она не может быть вложенной. Т.е. если в теле процедуры мы уже используем код INSERT EXEC, то рекордсет из этой процедуры мы не сможем вставить в таблицу. На Microsoft Connect есть фитбек с этой проблемой (
Cannot have nested INSERT ... EXEC) и совсем недавно эту проблему закрыли с пометкой
as Won't Fix.
Но, что делать, если нам все-таки необходимо вывести результат работы процедуры в таблицу? Именно тому, как обойти одно из ограничений сиквела и посвящён этот пост.
[Ещё]
3e08e459-b6f5-4e3a-b49a-d2ec8a3f4e28|4|5.0|27604f05-86ad-47ef-9e05-950bb762570c
Tags: SQL Server
SQL Server
by Alexey Knyazev
28. июля 2011 01:27
Совсем недавно в общем доступе появился SQL Server 2011 Denali CTP (Community Technology Preview) 3. Пора подводить небольшие итоги, т.к. релиз уже не за горами. О том, что нового нас ждёт, уже сейчас можно найти, в том числе и на просторах Рунета.
В CTP 3 появились 14 новых функций и 1 была изменена, именно о них я хочу рассказать.
[Ещё]
by Alexey Knyazev
12. мая 2011 01:44
Хотелось бы поговорить о недокументированных процедурах, которые могут быть полезны в повседневной работе, а именно:
sp_MSforeachdb и
sp_MSforeachtable. Эти процедуры появились ещё в SQL Server версии 6.5 и, несмотря на то, что они продолжают присутствовать из версии к версии, их так и не описали в BOL (Books Online).
Эти процедуры позволяют выполнять операции над базами данных (sp_MSforeachdb) и таблицами (sp_MSforeachtable) перебирая их в курсоре. Немного расcкажу о каждой из этих процедур.
[Ещё]
eccefbf8-a6a0-448e-9486-97b29691abfe|5|4.2|27604f05-86ad-47ef-9e05-950bb762570c
Tags: SQL Server
SQL Server
by Alexey Knyazev
20. апреля 2011 12:49
Очень полезный постер с ключевыми счетчиками производительности, их описанием и пороговыми значениями.
SQL_post_29x21_2010_PerfmonFinal.pdf (265,49 kb)
[Ещё]
by Alexey Knyazev
20. февраля 2011 21:49
Рано или поздно, но у многих возникает вопрос, как определить список дисков, их общий объём и объём свободного пространства на них, при этом используя t-sql. На первый взгляд кажется, что задача должна решаться на раз, два, три. Но не все так просто.
Для решения этой задачи можно использовать несколько сценариев. Во первых хотелось бы вспомнить о недокументированной хранимой процедуре xp_fixedrives. Это очень полезная расширенная хранимая процедура, которая возвращает список всех установленных жестких дисков и размер в МБ свободного пространства для каждого жесткого диска.
[Ещё]
by Alexey Knyazev
17. февраля 2011 00:31
Транзакции указывают уровень изоляции, который определяет степень, до которой одна транзакция должна быть изолирована от изменений ресурса или данных, произведенных другими транзакциями. Уровни изоляции описаны с точки зрения того, какие из побочных эффектов параллелизма разрешены (например, «грязные» чтения или фантомные чтения).
Более подробно о всех уровянх изоляции можно прочитать в любой книге по SQL Server и на сайте Майкрософт - http://msdn.microsoft.com/ru-ru/library/ms189122.aspx
А в этой статье хочу поговорить об уровне изоляции READ UNCOMMITTED ( = подсказке NOLOCK ) и несогласованности данных, а так же о чудесах сиквела при уровне изоляции READ COMMITTED (уровень изоляции по умолчанию). [Ещё]
by Alexey Knyazev
26. января 2011 23:55
Восстановления базы из Backup`a или перенос её на другой сервер, "сбраcывает" значение "даты создания" этой базы данных (в таблицах sys.databases, msdb..backupset и т.д.).
Встаёт вопрос: как найти оригинальную дату создания!?
Гарантированный способ - это чтение данных из boot-страниц, а именно страница №9, с помощью команды DBCC PAGE.
[Ещё]
by Alexey Knyazev
26. января 2011 00:42
Существует очень раcпространенный миф, что конструкция insert into ... select ... from ... order by ... гарантирует последовательность вставки данных в таблицу согласно условию order by. Но это заблуждение, т.к. мы не можем гарантировать последовательность физической вставки данных. Сиквел сам (по своему, неведанному нам сценарию) определяет, как данные попадут в таблицу, последовательно или параллельно и какими кусками определяет оптимизатор. При этом кляуза (clause) просто игнорируется.
Но существует очень интересная особенность, когда в таблице, в которую осуществляется вставка, есть поле IDENTITY
[Ещё]
by Alexey Knyazev
22. декабря 2010 01:03
Сегодня я хочу рассказать более подробно об операторе APPLY, а конкретнее о его типе CROSS APPLY. Этот оператор появился впервые в SQL Server 2005, но к сожалению многие так и не научились им пользоваться, возможно это из-за того, что в BOL (SQL Server Books Online) этот оператор плохо описан и имеет очень "сухие" примеры его использования. В этой статье я покажу несколько интересных демонстраций, где этот оператор может пригодиться.
Основная фича оператора заключается в том, что APPLY позволяет вызывать табличную функцию для каждой строки, возвращаемой внешним табличным выражением запроса. Именно этот пример есть в BOL.
Оператор CROSS APPLY возвращает только строки из внешней таблицы, которые создает результирующий набор из возвращающего табличное значение функции. Оператор OUTER APPLY возвращает и строки, которые формируют результирующий набор, и строки, которые этого не делают, со значениями NULL в столбцах, созданных возвращающей табличное значение функцией.
[Ещё]