Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

TSQL разделя поравно набора от резултати на групи и ги актуализира

Не бях сигурен дали наистина искате заявка за актуализиране или заявка за избор. Следната заявка връща нов оператор за всяка поръчка, в зависимост от вашите условия:

/*
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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:ИЗТРИВАНЕ на данни от самореферентна таблица в определен ред

  2. Грешка при влизане в SQL Server

  3. Полето на SQL Server се съкращава

  4. Как да инсталирате SQL Server на Mac с VirtualBox

  5. Производителност на SQL сървър TOP CPU заявка -2