Получение полей таблицы в MSSQL - TSQL
MS SQL - по необходимостиЭтот запрос возвращает набор полей таблицы со всеми характеристиками. Метод также применим и замечательно работает с представлениями 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;
Читаль далее...
Установка русской кодировки на уже созданную базу данных (смена 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
Читаль далее...
Пример 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 - передача таблицы или списка значений в процедуру ( 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
В данной таблице будем размещать бутылки разных названий и цветов (просто для теста).Читаль далее...
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 Оконные функции - Пример ROWNUMBER OVER PARTITION BY
MS SQL - по необходимостиОконные функции — это такие функции которые на основе окна (набора записей) вычисляют скалярное (одиночное) значение. Это значение определяется с помощью инструкции 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. Комментировать...
MSSQL - Выбор N пронумерованных виртуальных записей записей при помощи системной таблицы SPT_VALUES
MS SQL - по необходимостиДанный пример может быть полезен, когда надо выбрать некоторое количество пронумерованных записей из неоткуда допустим во временную таблицу или табличную переменную.
Пример:
select number as Section from master..spt_values where type='L' and number>0 and number<=100
Пример выводит 100 строк таблицы с значениями от 1 до 100 и единственным столбцом Section. Комментировать...
MSSQL - Try Catch Transaction (Отменяем транзакцию с ошибкой корректно)
MS SQL - по необходимостиНиже приведен пример корректного отмена транзакции при ошибке:
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 останется таким, каким он был установлен в первой строке скрипта до начала транзакции. Комментировать...
Правильное выполнение транзакции в MSSQL
MS SQL - по необходимостиДва варианта выполнения транзакции в MSSQL, для которых при возникновении ошибки транзакция отменяется.
Первый вариант:
BEGIN TRY
BEGIN TRAN
UPDATE 1
UPDATE 2 --Ошибка
UPDATE 3
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
Второй вариант:
SET XACT_ABORT ON
BEGIN TRAN
UPDATE 1
UPDATE 2 --Ошибка
UPDATE 3
COMMIT TRAN
Оба варианта сделают одно и то-же при возникновении ошибки на втором шаге, отменят всю транзакцию включая первый шаг. Комментировать...
TSQL - Обновление одной таблицы с Join по второй (MSSQL - Update with join)
MS SQL - по необходимостиПример обновления данных в одной таблице с одновременным сопоставлением и проверкой условия по второй таблице при помощи JOIN:
update cc
set cc.ActivateState=2
from ClientsCards cc
left join ClientsCardsHeads cch
on cch.CardUid=cc.Uid
where cc.ActivateState=0 and cch.State=3
ClientsCards cc — Первая таблица в которой производится изменение.
ClientsCardsHeads cch — Вторая таблица с данными которой производится сверка. Комментировать...