Архив рубрики ‘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
Передача коллекции данных во встроенную процедуру
Posted: 3 сентября, 2012 in .NET, TSQLМетки:BULK INSERT, Table-Valued Parameters
У Дениса Гладких есть хорошая статья о том как передать список/коллекцию/множество в хранимую процедуру. Автор приводит три способа:
Решение 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
Вот такой вот способ. Похоже на стиль из олимпиадного программирования:)