Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

TSQL divide igualmente o conjunto de resultados em grupos e os atualiza


Eu não tinha certeza se você realmente queria uma consulta de atualização ou uma consulta de seleção. A consulta a seguir retorna um novo operador para cada pedido, sujeito às suas condições:
/*
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 

Basicamente, atribuiu um novo id às linhas para a junção. A tabela de pedidos recebe um valor entre 1 e o número de operadores, atribuídos aleatoriamente. Isso é então associado a um número de sequência nos operadores.

Se você precisar atualizar, poderá fazer algo como:
with toupdate as (<above query>)
update orders
    set operatorid = newoperatorid
    from toupdate
    where toupdate.orderid = orders.orderid

Suas duas perguntas:

Será melhor selecionar primeiro todos os pedidos e todos os operadores que atendam às condições da tabela temporária e depois fazer o embaralhamento ou fazer tudo em uma grande consulta?

O usuário de tabelas temporárias é uma questão de desempenho e requisitos da aplicação. Se os dados estão sendo atualizados rapidamente, sim, usar uma tabela temporária é uma grande vitória. Se você estiver executando a randomização muitas e muitas vezes nos mesmos dados, pode ser uma vitória, principalmente se as tabelas forem grandes demais para caber na memória. Caso contrário, não é provável que haja um grande ganho de desempenho em uma única execução, supondo que você coloque as condições nas subconsultas mais internas. No entanto, se o desempenho for um problema, você poderá testar as duas abordagens.

Gostaria de passar array ou grupos como parâmetro para meu procedimento. Qual opção seria a melhor para passar a matriz para o procedimento armazenado (SQL Server 2005).

Hmmm, mude para 2008 que tem parâmetros com valor de tabela. Aqui está um artigo de grande referência sobre o assunto de Erland Sommarskog:http:// www.sommarskog.se/arrays-in-sql-2005.html .