Округление даты до часа и до минут в MSSQL TSQL
Пример округления даты до часа и до минут
declare @dt datetime
set @dt = '09-22-2007 15:07:38.850'
select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)
Пример округления даты до часа и до минут
declare @dt datetime
set @dt = '09-22-2007 15:07:38.850'
select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)
Ниже приведен пример корректного отмена транзакции при ошибке:
update Params set Value=168 where Param = 'SessionHoursLimit'
PRINT @@TRANCOUNT
BEGIN TRY
BEGIN TRAN
PRINT @@TRANCOUNT
update Params set Value=167 where Param = 'SessionHoursLimit'
select 1/0 -- Если закомментировать эту строку то предыдущая строка выполнится
COMMIT TRAN
END TRY
BEGIN CATCH
if @@TRANCOUNT>0
ROLLBACK TRAN
END CATCH
PRINT @@TRANCOUNT
select * from Params
Если закомментировать строку с ошибочным оператором SELECT 1/0 то предшествующая строка будет выполнена и транзакция успешно завершится, если оставить строку SELECT 1/0 то транзакция отменится полностью, и параметр Value останется таким, каким он был установлен в первой строке скрипта до начала транзакции.
Вообще процесс чистки логов должен проходить планово, и следить за этим и настраивать должен профессиональный админ. Однако бывает так что на вашем казалось бы небольшом девелоперском проекте для тестов логи неожиданно превысили установленный размер и возникла следующая проблема:
Сама проблема:
The transaction log for database 'база_данных' is full due to 'LOG_BACKUP'.
Проблему разумеется надо решать.
И вот как это делается:
Для обрезки лога используется вот эта команда:
DBCC SHRINKFILE(база_данных_log, 100);
При выполнении этой команды, LOG файл будет обрезан до 100 мегабайт.
Простой пример MERGE для TSQL.
В примере подразумевается, что мы оперируем двумя одинаковыми по структуре таблицами (в реальной жизни это условие вовсе не обязательно).
Таблицы TargetTableи SourceTable — состоят всего из двух полей:
Id — некий идентификатор.
Name — Название объекта.
В примере ниже мы проверяем для всех записей из SourceTable — существует ли в таблице TargetTable запись с аналогичным Id и если существует, то меняем для этой записи поле Name в TargetTable, а если не существует то добавляем запись в TargetTable из SourceTable целиком.
MERGE TargetTable AS target -- таблица которую будем менять, таблица приемник
USING (SELECT Id, Name FROM SourceTable) AS source
ON (target.Id = source.Id) -- условие по которому сопоставляем источник и приемник
WHEN MATCHED AND target.Name!=source.Name -- Если такой уже есть, то проверяем не совпадает ли Name и если не совпадает то меняем
THEN UPDATE SET target.Name = source.Name -- обновляем
WHEN NOT MATCHED -- если такого Id нет в таблице target то добавляем
THEN INSERT VALUES(source.Id, source.Name) -- добавление записи
Вот и всё.
По умолчанию в MSSQL-Manager длинна строки в выборки ограничена, и при достаточно большом размере строки в выборку попадет только её часть, но есть способ обойти этот изъян.
Чтобы выбрать длинную строку, достаточно просто назначить имя на поле с названием [XML_F52E2B61-18A1-11d1-B105-00805F49916B].
Например:
select [Полк_с_длинным_varchar_max] as [XML_F52E2B61-18A1-11d1-B105-00805F49916B] from
[dbo].[Таблица]
Чтобы выбрать поля и все параметры по полю из таблицы достаточно воспользоваться процедурой SP_COLUMNS
Пример:
exec sp_columns [Наименование таблицы]
Этот запрос возвращает набор полей таблицы со всеми характеристиками. Метод также применим и замечательно работает с представлениями VIEW.
SELECT
ORDINAL_POSITION
,COLUMN_NAME
,DATA_TYPE
,CHARACTER_MAXIMUM_LENGTH
,IS_NULLABLE
,COLUMN_DEFAULT
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'Название таблицы'
ORDER BY
ORDINAL_POSITION ASC;
А вот так можно узнать права пользователя.
sp_HelpUser имя_пользователя
Иногда возникает необходимость, в ходе работы процедуры, удалить временно созданную таблицу которая может быть либо создана либо нет, тогда не достаточно просто написать например drop table #myTempTable — потому что в случае если таблицы не существует то запрос не выполнится и выдаст ошибку. Пример ниже показывает как правильно удалять временные таблицы в таком случае:
if exists (
select * from tempdb.dbo.sysobjects o
where o.xtype in ('U')
and o.id = object_id(N'tempdb..#myTempTable')
)
BEGIN
DROP TABLE #myTempTable;
END
Оконные функции — это такие функции которые на основе окна (набора записей) вычисляют скалярное (одиночное) значение. Это значение определяется с помощью инструкции OVER.
Пример:
select regioncode, aolevel, offname,
row_number() over(partition by regioncode order by aolevel, offname) as rownum
from s_adr_fias
order by regioncode, aolevel, offname;
В данном примере будет сделана выборка в которой для каждого regioncode в поле rownum будет нумерация отсортированных значений aolevel, offname.
Вот такая вот задача появилась, в случае отсутствия данных в таблице результат выборки максимального значения в поле выдаст значение null, можно конечно обрабатывать полученный результат в программе, но значительно проще возложить этот функционал на скрипт.
Делается это вот так:
SELECT (CASE WHEN MAX(ID) IS NULL THEN '0' ELSE MAX(ID) + 1 END) AS Expr1
FROM MyTable
Теперь, если в выборке будет пусто, то-есть null, то в качестве результата выборки будет передан 0.