0

J'ai un peu de problème à résoudre, et j'essaie de trouver une bonne solution. J'utilise MS SQL Server 2005, et donné une table où une colonne uniqueidentifier contient une clé de données à d'autres informations sur le serveur. Ce que je dois faire est de sélectionner chaque ligne dans ce datatable (sproc d'ASP.NET), mais séparé en tables basées sur cette colonne. Par exemple, à partirSélection de plusieurs tables à partir d'une seule table par valeur de colonne distincte dans la procédure stockée

------------------------------------ 
MyID | MyOtherData 
------------------------------------ 
4   asdf 
4   test 
3   qwerty 
2   morestuff 

Je veux que les trois tableaux suivants sont retournés:

------------------------------------ 
MyID | MyOtherData 
------------------------------------ 
4   asdf 
4   test 

------------------------------------ 
MyID | MyOtherData 
------------------------------------ 
3   qwerty 

------------------------------------ 
MyID | MyOtherData 
------------------------------------ 
2   morestuff 

Comment serait la meilleure façon pour moi d'aller contourner ce problème, si je ne sais pas combien uniques MyID valeurs il y aura à l'avance?

+1

La vraie question que j'ai ici est pourquoi? Cela pourrait aboutir à plusieurs ensembles de résultats .... et pourrait être très lourd. –

+1

Je suppose qu'il veut dire ensembles de résultats où il se réfère à des «tables», mais je suis avec Mitchel. Quel avantage cela offre-t-il sur le retour en une seule fois? – JohnFx

Répondre

2

Votre meilleur pari est de ne pas le faire dans le Proc, mais dans le code client.

  1. Ecrivez une requête/proc qui renvoie les valeurs myid distinctes (SELECT myid Distinct de MyTable)
  2. Dans votre application, boucle à travers chaque valeur sélectionnée et appeler un autre proc qui prend une valeur monId et renvoie un jeu d'enregistrements pour cette valeur. (SELECT MyOtherData de MyTable où MyID =?)
+0

Dépend du nombre de jeux de résultats générés. Boucler comme ça du côté des clients me rappelle les problèmes de performance que j'ai vus: 200 à 800 allers-retours pour afficher une seule page Web. –

+0

C'est vrai.Il y a un compromis certain entre une requête monolithique qui verrouille des ressources pour de longues périodes et une série de requêtes courtes qui rattrapent le temps d'ouverture et de fermeture des connexions (bien que la mise en commun devrait couvrir cela). La solution idéale ressemble à une refonte de la base de données ou de la logique de l'application pour éviter tout le problème. – JohnFx

1

La seule chose qui vient à l'esprit, et ce n'est pas une très bonne idée .... mais serait de créer un curseur, qui fonctionne sur une requête qui ne

SELECT DISTINCT MyId DE MyTable

Ensuite, chaque itération du curseur fait la sélection respective ...

1

Je pense que vous devriez essayer de repenser votre approche que je ne pense pas que ce sera très évolutive et je pense essayer de trouver un moyen d'y parvenir ne sera pas rentable à long terme. Au lieu de cela, pourriez-vous renvoyer un seul ensemble de résultats, ordonné par MyID, puis gérer différemment ce resultset dans .NET?

0

Vous pouvez créer une structure de boucle qui parcourt un sous-ensemble des ID de la table principale pour créer un ensemble de résultats distinct pour chaque ensemble de tables. C'est moche, mais j'espère que c'est juste une chose ad hoc que vous voulez mettre de côté et que vous ne voudrez plus jamais avoir à traiter.

DECLARE @Entities TABLE 
(
    ID int IDENTITY (1, 1) PRIMARY KEY NOT NULL, 
    MyID int, 
    MyOtherData varchar(100) 
) 

INSERT INTO @Entities (MyID, MyOtherData) 
SELECT MyID, MyOtherData 
FROM TheMainTable 
ORDER BY MyID, MyOtherData 

DECLARE @Count int 
DECLARE @Max int 

SET @Count = 1 
SELECT @Max = COUNT(ID) FROM @Entities 

DECLARE @MyID_Current int 

WHILE (@Count <= @Max) 
BEGIN 

    SELECT @MyID_Current = MyID 
    FROM @Entities 
    WHERE ID = @Count 

    -- Output each individual result set. 
    SELECT MyID, MyOtherData 
    FROM @Entities 
    WHERE MyID = @MyID_Current 

    SET @Count = @Count + 1 

END 

Pour quelque chose d'encore plus laid, vous pourriez au lieu de simplement barattage les jeux de résultats séparés CREER ou SELECT INTO une nouvelle table unique nommée dans votre base de données à chaque itération, et insérer les enregistrements d'un myid particulier dans cette table .

0
DECLARE @Entities TABLE 
(
ID int IDENTITY (1, 1) PRIMARY KEY NOT NULL, 
MyID int, 
MyOtherData varchar(100) 
) 

INSERT INTO @Entities (MyID, MyOtherData) 
SELECT MyID, MyOtherData 
FROM TheMainTable 
ORDER BY MyID, MyOtherData 

DECLARE @Count int 
DECLARE @Max int 

SET @Count = 1 
SELECT @Max = COUNT(ID) FROM @Entities 

DECLARE @MyID_Current int 

WHILE (@Count <= @Max) 
BEGIN 

SELECT @MyID_Current = MyID 
FROM @Entities 
WHERE ID = @Count 

-- Output each individual result set. 
SELECT MyID, MyOtherData 
FROM @Entities 
WHERE MyID = @MyID_Current 

SET @Count = @Count + 1 

END 
Questions connexes