0

Je dois transmettre une collection .NET à une procédure stockée. Ma collection contient 1000 enregistrements. Chaque enregistrement contient 2 ou 3 objets enfants d'autres types. Tout ce dont j'ai besoin pour les insérer à la fois en appelant la procédure stockée de. NET.Comment faire pour passer la hiérarchie .NET collection d'objets (parent-enfant) à une procédure stockée SQL Server

J'ai déjà essayé un paramètre TVP (table-valued), mais cela ne répond tout simplement pas à mes besoins.

Pour chaque enregistrement de niveau racine, j'ai besoin d'appeler la procédure stockée en passant l'enregistrement racine et ses enregistrements enfants correspondants. Cela rend l'ensemble du processus très lent.

C'est pourquoi je suis à la recherche d'une façon de pouvoir transmettre une liste hiérarchique complète à la fois, et dans une procédure stockée, en bouclant et en itérant des enregistrements enfants, je peux insérer des enregistrements enfants parents.

Comment puis-je y parvenir?

+0

Essayez de utilisez XML et décompactez-le sur la table temporaire dans la procédure stockée. Cela fonctionne assez vite pour moi. –

+0

Les paramètres de valeur de table sont un bon moyen de le faire. Il suffit de passer 2 tables, une pour le parent autre pour l'enfant, à la fois et une clé pour les associer. – Alejandro

+0

@Alejandro: Actuellement, je passe presque de la même manière. Mais plutôt de passer parent entier comme une table et des enfants entiers comme les autres, je passe un enregistrement parent avec sa liste correspondante d'enfants. Mais c'est vraiment lent, parce que j'ai besoin d'insérer un enregistrement parent 100K. De plus, pour chaque parent célibataire, il y a 3 ou 4 enfants associés. – Usman

Répondre

3

Je viens de le faire il y a 3 semaines.

  1. créer une clé d'association « temp » (j'ai utilisé un GUID) pour relier les parents et les enfants ensemble parce que vous n'avez pas la base de données ids (la clé temporaire est jamais enregistré dans la base de données)
  2. Appel d'un Procédure stockée TVP. Créez une table temporaire ou une table var pour stocker la relation tempid/database id
  3. Utilisez l'instruction de fusion avec OUTPUT pour obtenir la valeur Inserted.Id et id temp dans la table temporaire créée à l'étape 3
  4. utiliser un CTE et la fusion déclaration pour insérer les enregistrements enfants en utilisant l'identifiant DB réels de du dossier parent

Voici quelques liens sur le processus avec "vrais" exemples:

merge parent and child SQL Server tables

T-SQL - Insert Data into Parent and Child Tables

+0

Keith: Pourriez-vous me dire comment transmettre la liste hiérarchique Parent-Enfant de .NET à la procédure stockée? Je ne veux pas casser la hiérarchie d'un parent lors du passage de la liste entière. Parce que, plus tard, il serait difficile d'associer chaque enfant à son entité parente correspondante. – Usman

+0

J'ai écrit des exemples de code dans ma réponse (le deuxième lien dans celui-ci), mais seulement à la partie sql. Avez-vous besoin de l'échantillon côté .net? –

+0

Ouais si vous pouviez gérer la réponse détaillée, ce serait vraiment bien :-) – Usman

0

Vous pouvez utiliser XML pour passer des dossiers ainsi que leurs enfants à la procédure stockée. Par exemple

DECLARE @xml XML = '<root> 
<parent value="213"> 
    <child childValue="1111"></child> 
    <child childValue="1112"></child> 
</parent> 
<parent value="2313"> 
    <child childValue="3333"></child> 
    <child childValue="3332"></child> 
</parent> 
</root>' 

Ensuite, vous pouvez faire beaucoup de façons, l'un d'entre eux est de dénormaliser dossiers et enregistrer à la table temporaire pour un traitement ultérieur

SELECT 
    T.c.value('parent::*/@value', 'INT') AS ParentValue, 
    T.c.value('@childValue', 'INT') AS ChildValue 
    FROM @xml.nodes('/root[1]/parent/child') T(c) 

Résultat ressemblera

ParentValue ChildValue 
    213   1111 
    213   1112 
    2313   3332 
    2313   3333 
+0

Je suis désolé mais je ne peux pas utiliser XML du tout. Ceci est extra-tête dans l'application. Je travaille avec des enregistrements 100K à la fois et la construction en mémoire xml avec des enregistrements parent uniques consister en 80 colonnes contenant 10 enfants colonne serait une très mauvaise idée. – Usman