Агрегирующее побитовое OR на T-SQL и в виде CLR-сборки

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.

[Ещё]

Tags: , ,

SQL Server

Обходим ошибку An INSERT EXEC statement cannot be nested

by Alexey Knyazev 18. сентября 2011 00:09
В SQL Server есть ограничение на инструкцию INSERT EXEC - она не может быть вложенной. Т.е. если в теле процедуры мы уже используем код INSERT EXEC, то рекордсет из этой процедуры мы не сможем вставить в таблицу. На Microsoft Connect есть фитбек с этой проблемой (Cannot have nested INSERT ... EXEC) и совсем недавно эту проблему закрыли с пометкой as Won't Fix.


Но, что делать, если нам все-таки необходимо вывести результат работы процедуры в таблицу? Именно тому, как обойти одно из ограничений сиквела и посвящён этот пост.

[Ещё]

Tags:

SQL Server

SQL Server 2011 (Denali CTP3). 14 новых функций и 1 изменена.

by Alexey Knyazev 28. июля 2011 01:27

Совсем недавно в общем доступе появился SQL Server 2011 Denali CTP (Community Technology Preview) 3. Пора подводить небольшие итоги, т.к. релиз уже не за горами. О том, что нового нас ждёт, уже сейчас можно найти, в том числе и на просторах Рунета.
В CTP 3 появились 14 новых функций и 1 была изменена, именно о них я хочу рассказать.

[Ещё]

Tags: , ,

SQL Server

sp_MSforeachview и sp_MSforeachproc

by Alexey Knyazev 12. мая 2011 01:44
Хотелось бы поговорить о недокументированных процедурах, которые могут быть полезны в повседневной работе, а именно: sp_MSforeachdb и sp_MSforeachtable. Эти процедуры появились ещё в SQL Server версии 6.5 и, несмотря на то, что они продолжают присутствовать из версии к версии, их так и не описали в BOL (Books Online).

Эти процедуры позволяют выполнять операции над базами данных (sp_MSforeachdb) и таблицами (sp_MSforeachtable) перебирая их в курсоре. Немного расcкажу о каждой из этих процедур.

[Ещё]

Tags:

SQL Server

SQL Server Perfmon Counters Poster

by Alexey Knyazev 20. апреля 2011 12:49
Очень полезный постер с ключевыми счетчиками производительности, их описанием и пороговыми значениями.


SQL_post_29x21_2010_PerfmonFinal.pdf (265,49 kb)

[Ещё]

Tags: ,

SQL Server

Объём дисков на T-SQL

by Alexey Knyazev 20. февраля 2011 21:49

Рано или поздно, но у многих возникает вопрос, как определить список дисков, их общий объём и объём свободного пространства на них, при этом используя t-sql. На первый взгляд кажется, что задача должна решаться на раз, два, три. Но не все так просто.



Для решения этой задачи можно использовать несколько сценариев. Во первых хотелось бы вспомнить о недокументированной хранимой процедуре xp_fixedrives. Это очень полезная расширенная хранимая процедура, которая возвращает список всех установленных жестких дисков и размер в МБ свободного пространства для каждого жесткого диска.

[Ещё]

Tags: , ,

PowerShell | SQL Server

Уровни изоляции и несогласованность данных

by Alexey Knyazev 17. февраля 2011 00:31

Транзакции указывают уровень изоляции, который определяет степень, до которой одна транзакция должна быть изолирована от изменений ресурса или данных, произведенных другими транзакциями. Уровни изоляции описаны с точки зрения того, какие из побочных эффектов параллелизма разрешены (например, «грязные» чтения или фантомные чтения).
Более подробно о всех уровянх изоляции можно прочитать в любой книге по SQL Server и на сайте Майкрософт - http://msdn.microsoft.com/ru-ru/library/ms189122.aspx


А в этой статье хочу поговорить об уровне изоляции READ UNCOMMITTED ( = подсказке NOLOCK ) и несогласованности данных, а так же о чудесах сиквела при уровне изоляции READ COMMITTED (уровень изоляции по умолчанию). [Ещё]

Tags: , , , ,

SQL Server

Как найти реальную дату создания БД

by Alexey Knyazev 26. января 2011 23:55

Восстановления базы из Backup`a или перенос её на другой сервер, "сбраcывает" значение "даты создания" этой базы данных (в таблицах sys.databases, msdb..backupset и т.д.).

Встаёт вопрос: как найти оригинальную дату создания!?
Гарантированный способ - это чтение данных из boot-страниц, а именно страница №9, с помощью команды DBCC PAGE.


[Ещё]

Tags: ,

SQL Server

INSERT + ORDER BY

by Alexey Knyazev 26. января 2011 00:42

Order by


Существует очень раcпространенный миф, что конструкция insert into ... select ... from ... order by ... гарантирует последовательность вставки данных в таблицу согласно условию order by. Но это заблуждение, т.к. мы не можем гарантировать последовательность физической вставки данных. Сиквел сам (по своему, неведанному нам сценарию) определяет, как данные попадут в таблицу, последовательно или параллельно и какими кусками определяет оптимизатор. При этом кляуза (clause) просто игнорируется.
Но существует очень интересная особенность, когда в таблице, в которую осуществляется вставка, есть поле IDENTITY

[Ещё]

Tags: , , , , ,

SQL Server

Чудесный оператор CROSS APPLY

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 в столбцах, созданных возвращающей табличное значение функцией.

[Ещё]

Tags: , , ,

SQL Server