Не бях сигурен дали наистина искате заявка за актуализиране или заявка за избор. Следната заявка връща нов оператор за всяка поръчка, в зависимост от вашите условия:
/*
with orders as (select 1 as orderId, 'order1' as orderDesc, 1 as OperatorId),
operators as (select 1 as operatorID, 'John' as name)
*/
select o.*, op.name as NewOperator, op.operatorID as NewOperatorId
from (select o.*, (ROW_NUMBER() over (order by newid()) % numoperators) + 1 as randseqnum
from Orders o cross join
(select COUNT(*) as numoperators from operators) op
) o join
(select op.*, ROW_NUMBER() over (order by newid()) as seqnum
from Operators op
) op
on o.randseqnum = op.seqnum order by orderid
Той основно присвои нов идентификатор на редовете за присъединяване. Таблицата с поръчки получава стойност между 1 и броя оператори, зададени на случаен принцип. След това това се присъединява към пореден номер на операторите.
Ако трябва да актуализирате, тогава можете да направите нещо като:
with toupdate as (<above query>)
update orders
set operatorid = newoperatorid
from toupdate
where toupdate.orderid = orders.orderid
Вашите два въпроса:
Ще бъде ли по-добре първо да изберете всички всички поръчки и всички оператори, които отговарят на условията, към временната таблица и след това да извършите разбъркването или да направите всичко в една голяма заявка?
Потребителят на временни таблици е въпрос на производителност и изисквания към приложението. Ако данните се актуализират бързо, тогава да, използването на временна таблица е голяма победа. Ако изпълнявате рандомизирането много, много пъти на едни и същи данни, тогава това може да бъде победа, особено ако таблиците са твърде големи, за да се поберат в паметта. В противен случай няма вероятност да има голямо увеличение на производителността при еднократно изпълнение, ако приемем, че поставите условията в най-вътрешните подзаявки. Ако обаче производителността е проблем, можете да тествате двата подхода.
Бих искал да предам масив или групи като параметър на моята процедура. Коя опция би била най-добрата за предаване на масив към съхранена процедура (SQL Server 2005).
Хммм, превключете към 2008, която има параметри с таблични стойности. Ето една много референтна статия по темата от Erland Sommarskog:http:// www.sommarskog.se/arrays-in-sql-2005.html .