powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А если команд должно быть много?...
6 сообщений из 6, страница 1 из 1
А если команд должно быть много?...
    #32018288
Илья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ. Но похоже я слишком упростил задачу.
Реально требуется написать скрипт вычищающий по определенному алгоритму лишние строки из таблицы перед созданием составного ключа (по полям MLSID и MLSNO). Я пытался сделать это с использованием временной таблицы и идентификации в ней всех записей по новому ID-полю (UNIQUE_ID). Сейчас это выглядит вот так:

CREATE PROCEDURE RemoveDuplicates @tableName varchar(64) AS

DECLARE @mysql nvarchar(4000)

SET @mysql = N'

if object_id( ''tempdb..#' + @tableName + ''' ) is not NULL
drop table #' + @tableName + ';

select top 1 *
into #' + @tableName +
' from ' + @tableName +
' option( fast 1 );

truncate table #' + @tableName + ';

alter table #' + @tableName + ' add UNIQUE_ID int identity( 1, 1 ) not null;

insert into #' + @tableName + ' select * from ' + @tableName + ' ;

truncate table ' + @tableName + ' ;

alter table ' + @tableName + ' add UNIQUE_ID int;

alter table ' + @tableName + ' alter column MLSID nvarchar( 8 ) not null;

alter table ' + @tableName + ' alter column MLSNO nvarchar( 7 ) not null;

alter table ' + @tableName + ' add primary key (MLSID, MLSNO);

insert into ' + @tableName + '
select * from #' + @tableName + '
where UNIQUE_ID in (
select min( UNIQUE_ID )
from #' + @tableName + '
group by MLSID, MLSNO
)

alter table ' + @tableName + ' drop column UNIQUE_ID;

drop table #' + @tableName + ';'

exec(@mysql)
GO

...и естественно не работает, поскольку запрос на выборку из таблицы с использованием поля UNIQUE_ID начинает выполняться быстрее того как это поле создано (или после того как уже удалено).

(1 row(s) affected)
Server: Msg 207, Level 16, State 3, Line 25
Invalid column name 'UNIQUE_ID'.
Server: Msg 207, Level 16, State 1, Line 25
Invalid column name 'UNIQUE_ID'.

Соответственно вопрос: как наиболее просто синхронизировать выполнение различных команд в одном batch?

С уважением,
Илья
...
Рейтинг: 0 / 0
А если команд должно быть много?...
    #32018289
Илья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри... Немного не попал.
Это предполагалось в продолжение темы "Использование переменных/параметров во FROM clause"
...
Рейтинг: 0 / 0
А если команд должно быть много?...
    #32018307
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. IMHO т.к. задуманное вами использует команду(ы) alter table, которая меняет структуру таблицы, участвующей в batch, то эта команда(ы) должна быть вынесена в отдельный batch. Т.е. данную задачу надо решать через промежуточную постоянную таблицу, а не временную.
1-ый batch - создаем промежуточную таблицу и копируем в нее данные
2-ой batch - изменяем структуру основной таблицы
3-ий batch - копируем данные из промежуточной таблицы и удаляем ее

2. Если этот кусок вашего скрипта
select top 1 * into #' + @tableName + ' from ' + @tableName +' option( fast 1 );
truncate table #' + @tableName + ';
alter table #' + @tableName + ' add UNIQUE_ID int identity( 1, 1 ) not null;

предназначен для создания временной таблицы, стурктура которой берется из основной таблицы, то IMHO можно и попроще
select identity(int, 1, 1 ) AS UNIQUE_ID, * into #' + @tableName + ' from ' + @tableName +' where 1=0;
...
Рейтинг: 0 / 0
А если команд должно быть много?...
    #32018372
Илья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь.
Но только я, что называется, пока еще very new в MS SQL. Поэтому еще один вопрос: а как синхронизировать выполнение различных batch? Насколько я понимаю если их запускать просто последовательно, то работать они будут почти параллельно...
...
Рейтинг: 0 / 0
А если команд должно быть много?...
    #32018376
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Насколько я понимаю если их запускать просто последовательно, то работать они будут почти параллельно

Из разных конектов - да
из одного коннекта - нет

В вашем случае дело не в параллельности, а в том, что имеется ряд команд, который обязательно должны выполняться в отдельном batch, в том числе и "A table cannot be altered and then the new columns referenced in the same batch." - Т.е. нельзя изменять таблицу и ссылаться на вновь добавленный столбец в одном и том же batch. Это надо принять как аксиому и, исходя из этого, писать batch-и.


Еще раз повторюсь - из одного коннекта batch-и сихронизировать не нужно, они выполняются в порядке поступления их от клиентского приложения.
Для синхронизации batch-ей, выполняющихся из разных коннектов, существуют транзакции, т.е. блокировки объектов и данных на время выполнения batch-а или его части. Это встроенный механизм. Если его возможности не удовлетворяют (например, нужна блокировка данных на уровне записи), то можно создать и свой механизм блокировки на основе тех же семафоров.
...
Рейтинг: 0 / 0
А если команд должно быть много?...
    #32018394
Илья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, действительно так и оказалось. Теперь все работает как надо.
Еще раз большое спасибо.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А если команд должно быть много?...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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