Jeg var ikke sikker på, om du virkelig ville have en opdateringsforespørgsel eller en udvalgt forespørgsel. Følgende forespørgsel returnerer en ny operatør for hver ordre, underlagt dine betingelser:
/*
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
Det tildelte grundlæggende et nyt id til rækkerne for joinforbindelsen. Ordretabellen får en værdi mellem 1 og antallet af operatører, tilfældigt tildelt. Dette er så forbundet med et sekvensnummer på operatørerne.
Hvis du har brug for at opdatere, så kan du gøre noget som:
with toupdate as (<above query>)
update orders
set operatorid = newoperatorid
from toupdate
where toupdate.orderid = orders.orderid
Dine to spørgsmål:
Vil det være bedre først at vælge alle alle ordrer og alle operatører, der opfylder betingelserne for midlertidig tabel, og derefter foretage blandingen eller at gøre det hele i én stor forespørgsel?
Brugeren af midlertidige tabeller er et spørgsmål om ydeevne og krav til applikationen. Hvis dataene opdateres hurtigt, ja, det er en stor gevinst at bruge en midlertidig tabel. Hvis du kører randomiseringen mange, mange gange på de samme data, så kan det være en gevinst, især hvis bordene er for store til at passe i hukommelsen. Ellers er der ikke sandsynlighed for en stor præstationsgevinst på en engangskørsel, forudsat at du placerer betingelserne inden for de inderste underforespørgsler. Men hvis ydeevne er et problem, kan du teste de to tilgange.
Jeg vil gerne overføre array eller grupper som en parameter til min procedure. Hvilken mulighed ville være den bedste til at overføre array til lagret procedure (SQL Server 2005).
Hmmm, skift til 2008, som har parametre med tabelværdi. Her er en meget referenceartikel om emnet af Erland Sommarskog:http:// www.sommarskog.se/arrays-in-sql-2005.html .