Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
А если команд должно быть много?...
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ. Но похоже я слишком упростил задачу. Реально требуется написать скрипт вычищающий по определенному алгоритму лишние строки из таблицы перед созданием составного ключа (по полям 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? С уважением, Илья ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2001, 06:33 |
|
||
|
А если команд должно быть много?...
|
|||
|---|---|---|---|
|
#18+
Сорри... Немного не попал. Это предполагалось в продолжение темы "Использование переменных/параметров во FROM clause" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2001, 06:36 |
|
||
|
А если команд должно быть много?...
|
|||
|---|---|---|---|
|
#18+
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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2001, 08:48 |
|
||
|
А если команд должно быть много?...
|
|||
|---|---|---|---|
|
#18+
Спасибо за помощь. Но только я, что называется, пока еще very new в MS SQL. Поэтому еще один вопрос: а как синхронизировать выполнение различных batch? Насколько я понимаю если их запускать просто последовательно, то работать они будут почти параллельно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2001, 05:20 |
|
||
|
А если команд должно быть много?...
|
|||
|---|---|---|---|
|
#18+
>Насколько я понимаю если их запускать просто последовательно, то работать они будут почти параллельно Из разных конектов - да из одного коннекта - нет В вашем случае дело не в параллельности, а в том, что имеется ряд команд, который обязательно должны выполняться в отдельном batch, в том числе и "A table cannot be altered and then the new columns referenced in the same batch." - Т.е. нельзя изменять таблицу и ссылаться на вновь добавленный столбец в одном и том же batch. Это надо принять как аксиому и, исходя из этого, писать batch-и. Еще раз повторюсь - из одного коннекта batch-и сихронизировать не нужно, они выполняются в порядке поступления их от клиентского приложения. Для синхронизации batch-ей, выполняющихся из разных коннектов, существуют транзакции, т.е. блокировки объектов и данных на время выполнения batch-а или его части. Это встроенный механизм. Если его возможности не удовлетворяют (например, нужна блокировка данных на уровне записи), то можно создать и свой механизм блокировки на основе тех же семафоров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2001, 07:18 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3525&tid=1824744]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
26ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 312ms |

| 0 / 0 |
