Удаление временных таблиц в MSSQL

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

MSSQL Оконные функции - Пример ROWNUMBER OVER PARTITION BY

Оконные функции — это такие функции которые на основе окна (набора записей) вычисляют скалярное (одиночное) значение. Это значение определяется с помощью инструкции 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 а надо 0.

Вот такая вот задача появилась, в случае отсутствия данных в таблице результат выборки максимального значения в поле выдаст значение null, можно конечно обрабатывать полученный результат в программе, но значительно проще возложить этот функционал на скрипт.

Делается это вот так:

SELECT     (CASE WHEN MAX(ID) IS NULL THEN '0' ELSE MAX(ID) + 1 END) AS Expr1
FROM         MyTable


Теперь, если в выборке будет пусто, то-есть null, то в качестве результата выборки будет передан 0.

Подробнее

Курсоры в MSSQL - перебор выборки в цикле.

Команды манипулирования данными SELECT, UPDATE, DELETE работают сразу с группами строк. Эти группы, вплоть до отдельных строк, можно выбрать с помощью опции WHERE. А если надо перебрать строки некоторой таблицы последовательно, одну за другой? На этот случай в языке SQL существуют курсоры. Курсор (current set of record) – временный набор строк, которые можно перебирать последовательно, с первой до последней.

При работе с курсорами используются следующие команды.

Объявление курсора: 
DECLARE имя_курсора CURSOR FOR SELECT текст_запроса
Любой курсор создается на основе некоторого оператора SELECT.

Подробнее

Установка русской кодировки на уже созданную базу данных (смена COLLATION)

Полезный пример изменения кодировки (COLLATION) на уже созданной базе данных.
В данном примере устанавливается русская кодировка: Cyrillic_General_CI_AS

USE master;
GO

-- Переводим БД в single-user mode
ALTER DATABASE [имя_базы_данных]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

-- Меняем кодировку COLLATION
ALTER DATABASE [имя_базы_данных]
COLLATE Cyrillic_General_CI_AS ;
GO

-- Переводим БД обратно в multi-user mode
ALTER DATABASE [имя_базы_данных]
SET MULTI_USER WITH ROLLBACK IMMEDIATE;
GO  
 
--Проверяем настройки COLLATION.
SELECT name, collation_name
FROM sys.databases
WHERE name = 'имя_базы_данных';
GO
Подробнее

Способ задать дату в MSSQL чтобы не зависеть от региональных настроек сервера.

Собственно привожу здесь пример того как можно сделать так, чтобы скрипт в MSSQL использующий дату отрабатывал правильно при любых региональных настройках и формате даты, я лично - это реализовал вот таким образом:

В скрипте пишем дату вот так:

convert(datetime,'"+data+"',120)

Где data это строка вот такого вида:

ГГГГ.ММ.ДД чч:мм:сс

- Именно на такой формат даты указывает число 120. Поэтому сервер уже не перепутает месяц с днём и т.п.

Для быстрого и безошибочного задания текущей даты можно использовать функцию:

{ fn NOW() }

Вот и всё.

Подробнее

Пример создания последовательности SEQUENCE в MSSQL

Примр создания последовательности SEQUENCE в MSSQL:

CREATE SEQUENCE [dbo].[CardNum] 
 AS [bigint]
 START WITH 1
 INCREMENT BY 1
 MINVALUE -9223372036854775808
 MAXVALUE 9223372036854775807
 CACHE 
GO

Этот сккрипт создаст последовательность SEQUENCE CardNum с типом BIGINT и стартовым значением 1 в текущей базе данных.


Чтобы получить новое значение value из последовательности SEQUENCE:

set @card_num =  NEXT VALUE FOR [dbo].[CardNum];


Чтобы получить текущие свойства properties для последовательности SEQUENCE:

SELECT * FROM sys.sequences WHERE name = 'CardNum' ;
Подробнее

Перезапуск (Restart) MSSQL Server на Linux (Ubuntu).

Перезапуск (Restart) MSSQL Server на Linux (Ubuntu).

Microsoft рекомендует перезапускать сервер так:

-- Получить состояние сервиса
sudo systemctl status mssql-server

-- Остановить сервис
sudo systemctl stop mssql-server

-- Запустить сервис
sudo systemctl start mssql-server

-- Перезапустить сервис
sudo systemctl restart mssql-server


Для Ubuntu я лично предпочитаю такой способ:

service mssql-server status
service mssql-server stop
service mssql-server start
service mssql-server restart
Подробнее