2013-05-23 4 views
0

Я просто чтение о курсорах SQL Server, что следует избегать их столько, сколько я могу :)SQL Server избегая курсоры

Всегда ли способ написать запрос/функцию/процедуру без курсоров?

Я нашел несколько примеров в Сети, но они, как правило, довольно просты.

Мой пример - я могу избежать курсоры ?:

Давайте процедуру обновления X, принимая идентификатор счета и идентификатор транзакции - это уникальный ключ строки, я хочу, чтобы обновить

Но есть больше сделок за счет

SELECT accID, transID from table 

Теперь я использую курсор петли на столе, всегда принимая accID и transID, чтобы получить строку и обновить его

Могу ли я сделать это не курсором?

Благодаря

+0

Как вы обновляете - какая логика? Это полностью зависит от логики, но для большинства операций, да, вы можете? – Oded

+0

У меня есть идентификатор учетной записи, но в «таблице» есть «номера вспомогательных счетов» = у меня есть ACC111, но есть ACC111-001; ACC111-002. Это означает, что я получаю все транзакционные идентификаторы: пары subAccountNum для одного идентификатора учетной записи, а затем использовать курсор для петли над этими парами и таблицу UPDATE SET x = y WHERE subAccId = @ subAccId и transID = @ transID (это помогает?) – Jaroslav

+1

Проверьте эту ссылку, есть много хороших примеров: http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them –

ответ

0

Смотрите этот пример из MSDN о том, как обновить одну таблицу на основе данных в других таблицах:

USE AdventureWorks2012; 
GO 
UPDATE Sales.SalesPerson 
SET SalesYTD = SalesYTD + SubTotal 
FROM Sales.SalesPerson AS sp 
JOIN Sales.SalesOrderHeader AS so 
    ON sp.BusinessEntityID = so.SalesPersonID 
    AND so.OrderDate = (SELECT MAX(OrderDate) 
         FROM Sales.SalesOrderHeader 
         WHERE SalesPersonID = sp.BusinessEntityID); 
GO 
1

меня попросили, чтобы узнать больше о том, что я хочу сделать, это бит слишком длинный, поэтому я добавлю его здесь как новый комментарий. Я не могу скопировать код здесь, поэтому я пытаюсь захватить хотя бы базу.

Мой код выглядел так:

DECLARE @headAcc varchar(20) 
set @headAcc='ACC111' 

declare @id varchar(20), @clId varchar(20) 
declare cur CURSOR for 
select addID, transID from Table1 
where accID like @headAcc+'%' and... 
order by 1 desc 

OPEN cur 
FETCH NEXT from cur into @accID, @transID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
-- 1 
update Table2 
    set colX = ... 
where [email protected] and [email protected] and... 
-- 2 
update Table3 
    set colY = ... 
where [email protected] and [email protected] and... 

FETCH NEXT from cur into @accID, @transID 
END 

CLOSE cur 
DEALLOCATE cur 

Спасибо за помощь в ответах и ​​ссылки в комментариях, я не был знаком с UPDATE JOIN и, и это должно быть ответом.

После прочтения статьи я придумал 2 обновления в форме, как:

DECLARE @headACC varchar(20) 
set @headACC='ACC111' 

update t2 
set t2.colX = ... 
from Table2 t2 
    join Table1 t1 
on t1.accID=t2.accID 
and t1.transID=t2.transID 
where t1.accID like @headAcc+'%' 
and... 

Это похоже на работу. Любые другие комментарии оцениваются, например. если есть более эффективный способ.

Смежные вопросы