Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Задачка по T-SQL  [new]
Rex12
Member

Откуда:
Сообщений: 39
Комрады, need help!

Стоит задача написания скрипта, который будет перемещать данные из одной таблицы (Table1) в другую (Table2), не прерывая обычный поток приложения и не блокируя таблицу Table1 на всё время процесса.

Я пока написал вот такое:

SELECT *
INTO Table2
FROM Table1 WITH (NOLOCK)

Не совсем понимаю, что имеется в виду под выражением "не прерывая обычный поток приложения" и что нужно дописать в код, чтобы оно соблюдалось.
14 фев 21, 00:46    [22280672]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8322
Rex12,

спросите у того, кто формулировал задачу. "обычный поток приложения" - это какая-то гуманитарная отсебятина.
14 фев 21, 02:11    [22280691]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
gritmax
Member

Откуда:
Сообщений: 1
>"не прерывая обычный поток приложения"
скорее всего пирложение однопоточное и во время выполнения запроса нужно возвращать результат как можно скорее чтобы поток начал выполнять следующий болк кода. "Обычный" не подходящее название да и "не прерывать" не получится (где то надо ожидать результат выполнения).

Самое быстрое когда можно вернуть результат - после вставки данных в Table1. При этому нужно асинхронно добавить данные в Table2. Для этого подходит Service Broker. На мой взгляд, нужно добавить асинхронный тригер с вызовом SB_AT_Fire_Trigger
DECLARE
	@inserted	XML,
	@deleted	XML;
	
SELECT @inserted =
	( SELECT * FROM inserted FOR XML PATH('row'), ROOT('inserted') );

SELECT @deleted = 
	( SELECT * FROM deleted FOR XML PATH('row'), ROOT('deleted') );

EXECUTE SB_AT_Fire_Trigger '{YourProcedureName}', @inserted, @deleted;
.

Пример.
14 фев 21, 10:57    [22280716]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
aleks222
Member

Откуда:
Сообщений: 1237
gritmax
Для этого подходит Service Broker.


Ээээ... Вы завсегда гвозди микроскопом забиваете?

Не надо маяться херней.

>>
Стоит задача написания скрипта, который будет перемещать данные из одной таблицы (Table1) в другую (Table2), не прерывая обычный поток приложения и не блокируя таблицу Table1 на всё время процесса.

declare @rc int = 1;
while @rc > 0 begin

    delete top(1000) Table1 output deleted.* into Table2;
    set @rc = @rowcount;

end;
14 фев 21, 14:27    [22280768]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
Rex12
Member

Откуда:
Сообщений: 39
Спасибо, aleks222!

Думаю, Ваш ответ подходит.

В оригинале задание звучит следующим образом:

1. You are asked to take data from Table1 to a new Table2.
2. Write a script that will move the data without interrupting the regular flow of the application and not locking Table1 for the entire process time.

А как теперь это увязать с первой частью задания?

Сообщение было отредактировано: 14 фев 21, 15:41
14 фев 21, 15:46    [22280782]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8322
Rex12,

нет, в задании мелось в виду использование "грязных чтений".
14 фев 21, 15:54    [22280784]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
Rex12
Member

Откуда:
Сообщений: 39
Владислав Колосов
Rex12,

нет, в задании мелось в виду использование "грязных чтений".


И как же тогда должен выглядеть запрос?
14 фев 21, 16:00    [22280786]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
aleks222
Member

Откуда:
Сообщений: 1237
Владислав Колосов
Rex12,

нет, в задании мелось в виду использование "грязных чтений".

Вы бредите. Какое "удаление" с грязными чтениями?
14 фев 21, 19:54    [22280833]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
Rex12
Member

Откуда:
Сообщений: 39
[quot aleks222#22280833]

Итоговый скрипт должен выглядеть как-то так?

declare @rc int = 1;
while @rc > 0 begin

SELECT * INTO Table2
FROM Table1 WITH (NOLOCK)
set @rc = @rowcount;

end;
14 фев 21, 20:08    [22280840]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
Rex12
Member

Откуда:
Сообщений: 39
aleks222,

Итоговый скрипт должен выглядеть как-то так?

declare @rc int = 1;
while @rc > 0 begin

SELECT * INTO Table2
FROM Table1 WITH (NOLOCK)
set @rc = @rowcount;

end;

Сообщение было отредактировано: 14 фев 21, 20:03
14 фев 21, 20:09    [22280842]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
aleks222
Member

Откуда:
Сообщений: 1237
Rex12
aleks222,

Итоговый скрипт должен выглядеть как-то так?

declare @rc int = 1;
while @rc > 0 begin

SELECT * INTO Table2
FROM Table1 WITH (NOLOCK)
set @rc = @rowcount;

end;


Боюсь, что ты ничего не понял.
Увы.
14 фев 21, 20:25    [22280850]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
Rex12
Member

Откуда:
Сообщений: 39
aleks222,

Вполне возможно. Но мы здесь для того и собираемся, чтобы аксакалы объясняли всем остальным, что к чему. Если, конечно, есть желание.

Алекс, можешь написать текст запроса и в двух словах объяснить, что там происходит?
14 фев 21, 21:04    [22280863]     Ответить | Цитировать Сообщить модератору
 Re: Задачка по T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8322
aleks222,

take data и will move можно толковать как угодно, с удалением исходных данных или без удаления. Об удалении явно не написано.
14 фев 21, 22:51    [22280877]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить