OPENXML avec jointure à gauche

J'ai 2 tables appelées comme "user" et "UserDetail" dans SQL Server 2008. La table principale "user" contient les colonnes suivantes

UserId Int, UserDate DateTime, ModifiedBy Int 

La table "UserDetail" contient les colonnes suivantes

 UserId Int ,UserIdDetailId Int ,Amount Int ,Balance Int 

La table Utilisateur contient des données comme suit

  UserId UserDate ModifiedBy 101 "01-Jan-2016" 100 102 "01-Feb-2016" 200 103 "01-Mar-2016" 300 

La table UserDetail contient des données

  UserId UserDetailId Amount Balance 101 1001 10 2 102 1002 20 4 

Pour la troisième ligne de la table Utilisateur, il n'y a pas d'loggings enfants dans la table UserDetail.

Maintenant, je veux récupérer les loggings de la table User et UserDetail en utilisant sp

À l'avant asp.net, j'encadre le xml et le passe à sql sp.

 <root> <rec UserId="101" UserDate="8/22/2016 12:00:00 AM" ModifiedBy="8/22/2016 01:10:59 PM" userdetails="System.Collections.Generic.List`1[UserDetail]"> <userdetail userdetailid="1001" amount="10" balance="2" /> </rec> <rec userid="102" userdate="8/22/2016 12:00:00 AM" modifiedby="8/22/2016 01:10:59 PM" userdetails="System.Collections.Generic.List`1[UserDetail]"> <userdetail userdetailid="1001" amount="1=20" balance="4" /> </rec> <rec userid="103" userdate="8/22/2016 12:00:00 AM" modifiedby="8/22/2016 01:10:59 PM" userdetails="System.Collections.Generic.List`1[UserDetail]" /> 

Le openxml en sql sp est comme suit

 SELECT * INTO #temp FROM ( SELECT m.UserId, m.UserDate, m.ModifiedBy, COALESCE(det.UserDetailId, -1) as UserDetailId FROM OPENXML(@i, '/Root/Rec', 1) WITH ( ,UserId INT '@UserId' ,UserDate DATETIME '@UserDate' ,ModifiedBy INT '@ModifiedBy' ) as m LEFT JOIN ( SELECT UserId, UserDetailId FROM OPENXML(@i, '/Root/Rec/UserDetail', 1) WITH ( UserId INT '@UserId' ,UserIdDetailId INT '@UserIdDetailId' ,Amount INT '@Amount' ,Balance INT '@Balance' ) ) as det ON m.UserId =det.UserId 

) p

Je veux le stocker dans la table #temp comme suit

 UserId UserDetailId UserDate ModifiedBy Amount Balance 101 1001 "01-Jan-2016" 100 10 2 102 1002 "01-Feb-2016" 200 20 4 103 1003 "01-Mar-2016" 300 NULL NULL 

Je veux get 103 UserId également dans cette table avec NULL pour les valeurs détaillées

Ma question est de savoir comment OPENXML doit être encadré pour get tous les loggings des tables User et UserDetail en utilisant des jointures dans OPENXML et je ne suis pas à l'aise avec OPENXML et ses jointures mais je veux que cela fonctionne correctement.

Au début, ajoutez Amount et Balance , de sorte que vous pouvez sélectionner ces champs:

 SELECT * INTO #temp FROM ( SELECT m.UserId, m.UserDate, m.ModifiedBy, COALESCE(det.UserDetailId, -1) as UserDetailId, det.Amount, det.Balance FROM OPENXML(@i, '/Root/Rec', 1) WITH ( UserId INT '@UserId', UserDate DATETIME '@UserDate', ModifiedBy INT '@ModifiedBy' ) as m LEFT JOIN ( SELECT UserId, UserDetailId, Amount, Balance FROM OPENXML(@i, '/Root/Rec/UserDetail', 1) WITH ( UserId INT '../@UserId', userdetailid INT '../@UserDetailId', Amount INT '@Amount', Balance INT '@Balance' ) ) as det ON m.UserId =det.UserId ) as p 

En ce qui concerne votre question, il n'est pas clair, quelle sortie vous voulez get de cette jointure.