Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

TSQL divise également le jeu de résultats en groupes et les met à jour

Je ne savais pas si vous vouliez vraiment une requête de mise à jour ou une requête de sélection. La requête suivante renvoie un nouvel opérateur pour chaque commande, sous réserve de vos conditions :

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

Il a essentiellement attribué un nouvel identifiant aux lignes pour la jointure. La table de commande obtient une valeur comprise entre 1 et le nombre d'opérateurs, attribués de manière aléatoire. Ceci est ensuite joint à un numéro de séquence sur les opérateurs.

Si vous avez besoin de mettre à jour, vous pouvez faire quelque chose comme :

with toupdate as (<above query>)
update orders
    set operatorid = newoperatorid
    from toupdate
    where toupdate.orderid = orders.orderid

Vos deux questions :

Vaut-il mieux sélectionner d'abord toutes les commandes et tous les opérateurs qui remplissent les conditions de la table temporaire, puis faire le brassage ou tout faire en une seule grande requête ?

L'utilisation des tables temporaires est une question de performances et d'exigences pour l'application. Si les données sont rapidement mises à jour, alors oui, l'utilisation d'une table temporaire est une grande victoire. Si vous exécutez la randomisation plusieurs fois sur les mêmes données, cela peut être une victoire, en particulier si les tables sont trop grandes pour tenir en mémoire. Sinon, il est peu probable qu'il y ait un grand gain de performances sur une exécution unique, en supposant que vous mettez les conditions dans les sous-requêtes les plus internes. Toutefois, si les performances posent problème, vous pouvez tester les deux approches.

Je voudrais passer un tableau ou des groupes en tant que paramètre de ma procédure. Quelle option serait la meilleure pour passer le tableau à la procédure stockée (SQL Server 2005).

Hmmm, passez à 2008 qui a des paramètres de table. Voici un article très référent sur le sujet par Erland Sommarskog :http:// www.sommarskog.se/arrays-in-sql-2005.html .