CREATE TABLE users (
user_id INT identity(1, 1) PRIMARY KEY --Идентификатор пользователя
,user_name NVARCHAR(100) NOT NULL --ФИО пользователя
)
CREATE TABLE groups (
group_id INT PRIMARY KEY --Идентификатор группы
,group_name NVARCHAR(100) NOT NULL --Название группы
,members_count INT NOT NULL --Количество участников группы
)
CREATE TABLE user_groups (
group_id INT
,user_id INT
)
INSERT INTO users (user_name)
VALUES (N'Алексеев А.А.')
,(N'Пискун А.А.')
,(N'Артамонов В.А.')
,(N'Лихачёв В.В.')
,(N'Тимашов А.А.')
,(N'Мурашов А.С.')
,(N'Краснов И.В.')
,(N'Писанкин А.В.')
,(N'Лебедев П.Е.')
,(N'Тихомиров Ф.А.')
INSERT INTO groups (
group_id
,group_name
,members_count
)
VALUES (
1
,N'Администраторы'
,1
)
,(
2
,N'Пользователи'
,3
)
,(
3
,N'Специалисты'
,4
)
,(
4
,N'Тестировщики'
,3
)
go
/**
Вопрос: Курсоры. Что такое? Зачем нужны?
Задание: Что происходит в курсоре ниже? (5 минут)
*/
DECLARE S CURSOR LOCAL FORWARD_ONLY READ_ONLY
FOR
SELECT group_id
,members_count
FROM groups
DECLARE @iGroupId INT
,@iMembersCount INT
OPEN S
FETCH NEXT
FROM s
INTO @iGroupId
,@iMembersCount
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO user_groups (
user_id
,group_id
)
SELECT TOP (@iMembersCount) u.user_id
,@iGroupId
FROM users AS u
ORDER BY NEWID()
FETCH NEXT
FROM s
INTO @iGroupId
,@iMembersCount
END
CLOSE s
DEALLOCATE S
go
/**
ВОПРОС: КАК ОБЪЕДИНИТЬ ТАБЛИЦЫ ГОРИЗОНТАЛЬНО (JOIN, ЕГО ВИДЫ; APPLY, ЕГО ВИДЫ)?
ЗАДАНИЕ: ДЛЯ КАЖДОЙ ГРУППЫ (GROUPS) ВЫВЕСТИ ВТОРОГО СОТРУДНИКА
(СОРТИОРВКА В АЛФАВИТНОМ ПОРЯДКЕ) (10-12 МИНУТ)
*/
/*select * from groups g
join user_groups ug on ug.group_id = g.group_id
join users u on u.user_id = ug.user_id
over (partition by )*/
go
/**
Вопрос: Как получить информацию об ошибке, чтобы ее обработать?
Задание: Дополнить процедуру обработкой ошибки. (Получить код и текст ошибки) (5 минут)
*/
CREATE PROCEDURE processingErrors
AS
BEGIN
DECLARE @nNumber NUMERIC(17, 2) = 10.00
,@nResult NUMERIC(17, 2)
BEGIN TRANSACTION
begin try
SET @nResult = @nNumber / 0
COMMIT
end try
begin catch
select error_message()
rollback transaction
end catch
END
go
EXEC processingErrors
go
/**
Вопрос: Динамический SQL: расскажи про опыт использования
*/
/**
Вопрос: Есть таблица из 20 полей. Производится синхронизация данных
с внешним сервисом. Как определить, что данные изменились?
*/
/**
Вопрос:
Разбор XML. Метод nodes
Изменение XML. Метод modify
Сбор XML из других XML. Типизированный XML
Использование схем для валидации XML
Задание:
1. Представить данные хмл в виде таблицы (Разбор xml). (5 минут)
2. Заменить значение атрибута value = '9988776655 для ноды, у которой атрибут ext_id=tax_code (3 минуты)
3. Удалить из xml элемент с ext_id=client_type (3 минуты)
*/
DECLARE @xXml XML = '<dataset>
<object ext_id="client_id" value="300000001" />
<object ext_id="branch_id" value="044525104" />
<object ext_id="tax_code" value="001122334455" />
<object ext_id="client_type" value="J" />
</dataset>',
@hdoc int
exec sp_xml_preparedocument @hdoc OUTPUT, @xXml
select ext_id, [value] from OPENXML(@hdoc, '/dataset/object', 2) WITH (
ext_id varchar(15) '@ext_id',
[value] varchar(20) '@value'
)
select a.* as TabRes
from @xXml.nodes('/dataset/object') a
go
/**
Оптимизация
Вопрос: большой запрос или много мелких. Что быстрее?
Как использовать план запроса?
Вопрос: Многопоточная обработка таблиц: как сделать,
чтобы потоки не обрабатывали одни и те же записи
Git
Что такое git? Для чего используется?
Что такое ветка? Зачем нужны ветки?
Как решать конфликты при слиянии?
*/