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

MS SQL - по необходимости

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

Читаль далее...

MSSQL курсоры

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

MS SQL - по необходимости

Полезный пример изменения кодировки (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 БД COLLATION TSQL Cyrillic_General_CI_AS

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

MS SQL - по необходимости

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

Пример MERGE в MSSQL T-SQL

MS SQL - по необходимости

Простой пример 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 TSQL merge SQL пример примеры

Объединение результатов запросов

MS SQL - по необходимости

На днях столкнулся с такой необходимостью — объеденить результаты выборки по двум запросам.
Чуть было не стал делать это программно, но слегка напряг извилины и выяснилось ничего сложного в том чтобы сделать это одним запросом нет.

Итак имеем 2 таблицы:

[Таблица1]
имеет поля: ID, ID_TAB2, NAME, FAMILY

Читаль далее...

MSSQL SQL

Чистка логов базы данных MSSQL

MS SQL - по необходимости

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

Сама проблема:

The transaction log for database 'база_данных' is full due to 'LOG_BACKUP'. 

Проблему разумеется надо решать.

И вот как это делается:

Для обрезки лога используется вот эта команда:
DBCC SHRINKFILE(база_данных_log, 100);

При выполнении этой команды, LOG файл будет обрезан до 100 мегабайт.

Смотреть дальше

MSSQL Log Чистка Базы данных SHRINKFILE

MSSQL - передача таблицы или списка значений в процедуру ( C# .NET )

MS SQL - по необходимости

Часто бывает необходимость передать за один раз некоторый набор данных в процедуру, в этой публикации будет приведен пример как это сделать на языке C# для базы данных MSSQL.

Использовать будем обычный способ вызова процедуры без каких либо фреймворков.

Для начала создадим тестовую таблицу в базе данных:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Bottles](
	[Uid] [uniqueidentifier] NOT NULL,
	[Name] [varchar](50) NULL,
	[Color] [varchar](50) NULL
) ON [PRIMARY]
GO
В данной таблице будем размещать бутылки разных названий и цветов (просто для теста).

Читаль далее...

MSSQL Procedure Table TSQL SQL

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

MS SQL - по необходимости

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

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

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

Где data это строка вот такого вида:
ГГГГ.ММ.ДД чч:мм:сс

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

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


Вот и всё, если придётся ещё чего нибудь в этом же роде изобретать — допишу.

Комментировать...

MSSQL datetime формат

Что делать если результат выборки NULL а надо 0.

MS SQL - по необходимости

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

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

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

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

Комментировать...

MSSQL

OFFSET FETCH пример применения в TSQL

MS SQL - по необходимости

Фильтр OFFSET FETCH в языке TSQL интересен тем что в отличии от фильтра TOP позволяет пропускать заданное количество строк ROWS.

Пример:

select regioncode, aolevel, offname from s_adr_fias
order by regioncode, aolevel, offname
offset 100 rows fetch next 50 rows only;


Данный пример демонстрирует выборку из набора отсортированного по условию ORDER BY (по полям regioncode, aolevel, offname) 50 строк данных пропустив первые 100 строк.

!!! Сначала выполняется именно сортировка, и только затем, из отсортированного набора данных берётся необходимый диапазон.

P.S. На больших объёмах, даже с учетом самой оптимальной индексации, данный фильтр является довольно ресурсоемким.

Комментировать...

MSSQL TSQL OFFSET FETCH SELECT Базы данных