powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка по T-SQL
13 сообщений из 13, страница 1 из 1
Задачка по T-SQL
    #40045156
Rex12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Комрады, need help!

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

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

SELECT *
INTO Table2
FROM Table1 WITH (NOLOCK)

Не совсем понимаю, что имеется в виду под выражением "не прерывая обычный поток приложения" и что нужно дописать в код, чтобы оно соблюдалось.
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045170
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rex12,

спросите у того, кто формулировал задачу. "обычный поток приложения" - это какая-то гуманитарная отсебятина.
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045187
gritmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>"не прерывая обычный поток приложения"
скорее всего пирложение однопоточное и во время выполнения запроса нужно возвращать результат как можно скорее чтобы поток начал выполнять следующий болк кода. "Обычный" не подходящее название да и "не прерывать" не получится (где то надо ожидать результат выполнения).

Самое быстрое когда можно вернуть результат - после вставки данных в Table1. При этому нужно асинхронно добавить данные в Table2. Для этого подходит Service Broker . На мой взгляд, нужно добавить асинхронный тригер с вызовом SB_AT_Fire_Trigger
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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;

.

Пример .
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045214
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gritmax
Для этого подходит Service Broker .


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

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
declare @rc int = 1;
while @rc > 0 begin

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

end;
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045224
Rex12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, 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.

А как теперь это увязать с первой частью задания?
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045225
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rex12,

нет, в задании мелось в виду использование "грязных чтений".
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045227
Rex12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
Rex12,

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


И как же тогда должен выглядеть запрос?
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045267
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Rex12,

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

Вы бредите. Какое "удаление" с грязными чтениями?
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045273
Rex12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot aleks222#22280833]

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

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

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

end;
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045275
Rex12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

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

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

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

end;
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045281
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rex12
aleks222,

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

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

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

end;


Боюсь, что ты ничего не понял.
Увы.
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045290
Rex12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

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

Алекс, можешь написать текст запроса и в двух словах объяснить, что там происходит?
...
Рейтинг: 0 / 0
Задачка по T-SQL
    #40045301
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

take data и will move можно толковать как угодно, с удалением исходных данных или без удаления. Об удалении явно не написано.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка по T-SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]