Получение текущей SESSION ID и TRANSACTION ID в MSSQL
Чтобы получить SESSION ID:
select @@spid
Чотбы получить TRANSACTION ID:
select CURRENT_TRANSACTION_ID()
Чтобы получить SESSION ID:
select @@spid
Чотбы получить TRANSACTION ID:
select CURRENT_TRANSACTION_ID()
"OFFSET FETCH" это фильтр который позволяет пропустить некоторое количество первых строк в выборке.
Например:
select field1, field2, field3
from table1
order by field1, field2
offset 100 rows fetch next 50 rows only;
Этот пример вернет строки с 101 по 150, из всех строк отсортированных по field1 и field2.
! Сначала будет произведена сортировка, затем возврат 50 строк.
! Для больших объемов данных этот способ требует много ресурсов, поэтому использовать лучше на минимизированных выборках.
Два способа выполнения транзакций в MSSQL, с отменой по ошибке.
Первый способ:
BEGIN TRY
BEGIN TRAN
UPDATE 1
UPDATE 2 --Error
UPDATE 3
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
Пример поиска процедуры по тексту который она содержит
SELECT name
FROM sys.procedures
WHERE Object_definition(object_id) LIKE '%некоторый_текст%'
Этот скрипт вернет названия всех процедур которые содержат в текст: "некоторый_текст"
Пример выбора диапазона дат:
WITH q AS
(
SELECT 1 AS num
UNION ALL
SELECT num + 1
FROM q
WHERE num < 10
)
SELECT DATEADD(DAY,0,cast(cast(DATEADD(DAY,-num,SYSDATETIME()) as date) as datetime))
FROM q
Пример обновления данных в одной таблице с одновременным сопоставлением и проверкой условия по второй таблице при помощи 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 - Вторая таблица с данными которой производится сверка.
Данный пример может быть полезен, когда надо выбрать некоторое количество пронумерованных записей из неоткуда допустим во временную таблицу или табличную переменную.
Пример:
select number as Section from master..spt_values where type='L' and number>0 and number<=100
Пример выводит 100 строк таблицы с значениями от 1 до 100 и единственным столбцом Section.
Пример, как отлавливать ошибки в MSSQL.
BEGIN TRY
-- Какой нибудь код который вернет ошибку для примера.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO
Часто бывает необходимость передать за один раз некоторый набор данных в процедуру, в этой публикации будет приведен пример как это сделать на языке 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
В данной таблице будем размещать бутылки разных названий и цветов (просто для теста).
Добавление записей в таблицу игнорируя IDENTITY:
-- Включаем
SET IDENTITY_INSERT tableA ON
-- Необходимо задать полный список солей для INSERT:
INSERT Into tableA ([id], [c2], [c3], [c4], [c5] )
SELECT [id], [c2], [c3], [c4], [c5] FROM tableB
-- Вариант "INSERT Into tableA SELECT ........" работать не будет
-- Выключаем
SET IDENTITY_INSERT tableA OFF