Архив рубрики ‘TSQL’

Уровни изоляции транзакций

Posted: 29 марта, 2024 in TSQL
Метки:

Полезные скрипты

Posted: 7 августа, 2013 in TSQL
Метки:, ,

В SSMS есть замечательная вкладка Template Explorer. Там куча скриптов почти на все случаи жизни. Простейшие скрипты можно запускать сразу. Если в скрипте есть параметры, то заходим в меню Query и выбираем Specify Values for Template Parameters. После этого указываем параметры и нажимаем ОК. Теперь скрипт с подставленными значениями тоже можно запускать.
Но эти скрипты очень многословны. Например скрипт добавления колонки занимает двадцать три строки! Из них шесть отводится только на комментарии, одиннадцать на создание таблицы %), три на собственно добавление самой колонки. Плюс несколько пустых строк. Конечно, эти скрипты скорее всего призваны быть как бы полуфабрикатами. Если что-то не нравится, то можно тут же изменить, никто нам этого не запрещает.
В процессе работы появились несколько скриптов, которые не столь тривиальны как добавление столбца. Эти скрипты используются довольно часто в наших проектах и просты в понимании:

1. Detach и Attach базы данных выглядит так


ALTER DATABASE Northwind SET OFFLINE WITH ROLLBACK IMMEDIATE
go
ALTER DATABASE Northwind SET ONLINE
go

2. Бекап и восстановление


BACKUP DATABASE Northwind TO DISK = N'C:\backups\Northwind.bak' WITH NOFORMAT, INIT, NAME = N'Northwind-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
alter database Northwind2 set single_user with rollback immediate
go
RESTORE DATABASE Northwind2 FROM DISK = N'C:\backups\Northwind.bak' WITH FILE = 1, NOUNLOAD, STATS = 10
go
alter database Northwind2 set multi_user
go

3. Шринк


dbcc shrinkdatabase ('Northwind')

4. Чтение из Excel файла


if object_id('dbo.SomeTable','u') is not null 
  drop table dbo.SomeTable
select 
  *
into 
 SomeTable
FROM 
 OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0','Data Source=c:\xls\Northwind.xlsx;Extended Properties=Excel 8.0')...Products$ s

5. Выборка из DBF. БД DBF должна быть предварительно прилинкована


select 
    *
FROM 
  DBF...Products

6. Курсор


use Northwind
go

declare @CategoryID int

DECLARE MY_CURSOR Cursor  
FOR
select 
 CategoryID
from 
 dbo.Products (nolock) 

open MY_CURSOR 

Fetch NEXT FROM MY_CURSOR INTO 
	@CategoryID 
WHILE @@FETCH_STATUS = 0
BEGIN

  begin try
    ...
      
    if /*условие*/
    begin
      declare @error nvarchar (max) = '...'
      raiserror(@error, 16, 1) -- уровень 16 значит сразу в catch переходит
    end

  end	try
  begin catch			
    print '************Ошибка! ' + ERROR_MESSAGE() ;
  end catch	 
  
  FETCH NEXT FROM MY_CURSOR INTO 
		  @CategoryID 
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR

У Дениса Гладких есть хорошая статья о том как передать список/коллекцию/множество в хранимую процедуру. Автор приводит три способа:

Решение 1. Строка – список значений, разделенных запятой
Решение 2. BULK INSERT
Решение 3. Table-Valued Parameters (Database Engine)

У нас в проекте использует еще одно решение… Если у вас на форме есть немного чекбоксов с выбором, то можно это все представить как число в двоичном счислении и завернуть в одну цифры в десятичном.

Пример: пусть у нас есть 5 чекбоксов с какими-то выборами (ClosedCheck, NotWorkCheck, TooSmallCheck, OthersCheck, LargeTo5CheckBox). Представим это все как одно число

int indicatorFlag = (ClosedCheck.Checked ? 1 : 0) + (NotWorkCheck.Checked ? 2 : 0) + (TooSmallCheck.Checked ? 4 : 0) + (OthersCheck.Checked ? 8 : 0) + (LargeTo5CheckBox.Checked ? 16 : 0);
cmd.Parameters.AddWithValue("@Indicator_Flag", indicatorFlag);

Со стороны встроенной процедуры имеем

@Indicator_Flag tinyint = 15 -- по умолчанию все единицы

А обращаться к отдельным битам нужно вот так

@Indicator_Flag&1 != 0
@Indicator_Flag&16 != 0

Вот такой вот способ. Похоже на стиль из олимпиадного программирования:)