Ik wist niet zeker of je echt een update-query of een select-query wilde. De volgende zoekopdracht levert een nieuwe operator op voor elke bestelling, afhankelijk van uw voorwaarden:
/*
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
Het wees in feite een nieuwe id toe aan de rijen voor de join. De volgordetabel krijgt een waarde tussen 1 en het aantal operators, willekeurig toegewezen. Dit wordt dan gekoppeld aan een volgnummer op de operators.
Als je moet updaten, kun je zoiets doen als:
with toupdate as (<above query>)
update orders
set operatorid = newoperatorid
from toupdate
where toupdate.orderid = orders.orderid
Uw twee vragen:
Is het beter om eerst alle orders en alle operators die aan de voorwaarden voldoen om tijdelijk te tafelen te selecteren en dan de shuffle te doen of alles in één grote query te doen?
De gebruiker van tijdelijke tabellen is een kwestie van prestaties en vereisten voor de toepassing. Als de gegevens snel worden bijgewerkt, ja, het gebruik van een tijdelijke tafel is een grote overwinning. Als u de randomisatie vele, vele malen op dezelfde gegevens uitvoert, kan het een overwinning zijn, vooral als de tabellen te groot zijn om in het geheugen te passen. Anders is er waarschijnlijk geen grote prestatiewinst bij een eenmalige run, ervan uitgaande dat u de voorwaarden binnen de binnenste subquery's plaatst. Als prestaties echter een probleem zijn, kunt u de twee benaderingen testen.
Ik wil array of groepen als parameter doorgeven aan mijn procedure. Welke optie zou het beste zijn om de array door te geven aan de opgeslagen procedure (SQL Server 2005).
Hmmm, schakel over naar 2008 met tabelwaardeparameters. Hier is een zeer referentieartikel over het onderwerp door Erland Sommarskog:http:// www.sommarskog.se/arrays-in-sql-2005.html .