2016-09-12 2 views
1

У меня есть 2 таблицы называются «Пользователь» и «UserDetail» в SQL Server 2008. Основная таблица «Пользователь» содержит следующие столбцыOPENXML с левым Регистрация

UserId Int, 
UserDate DateTime, 
ModifiedBy Int 

В таблице «UserDetail» содержит следующие колонки

UserId Int 
,UserIdDetailId Int 
,Amount Int 
,Balance Int 

в таблице приведены данные пользователя следующим

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

в таблице UserDetail содержит данные как

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

Для третьей строки таблицы пользователя в таблице UserDetail нет дочерних записей.

Теперь я хочу, чтобы получить записи из оба пользователя и UserDetail таблицы с использованием зра

В переднем конце asp.net, я обрамляю XML и передать его в SQL зр.

<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]" /> 

OpenXML в SQL зр выглядит следующим образом

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 

) р

Я хочу, чтобы хранить в #temp таблице следующим образом

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 

Я хочу получить 103 UserId al поэтому в этой таблице с NULL для детализации значений

Мой вопрос заключается в том, как OPENXML должна быть оформлена, чтобы получить все записи из пользователя и таблиц UserDetail с использованием соединений в OPENXML и я не устраивает OPENXML и его соединяет, но я как-то хотите, чтобы это выполнялось должным образом.

+0

Теперь я получаю все NULL из таблицы подробностей –

ответ

2

В первую добавить Amount и Balance, так что вы можете выбрать эти поля:

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 

Что касается вашего вопроса, то не понятно, что вывод, который вы хотите получить от этого соединения.

+0

Я получаю нули из записей UserDetail в xml в таблицу #temp –

+0

Вам нужно '../' в 'det' части. Измененный ответ. Я уже показываю вам этот запрос [здесь] (https://stackoverflow.com/questions/39427870/working-with-openxml/). В моем ответе я использовал '../' для принятия значений UserId с другого уровня. – gofr1

+0

Вы пробовали это решение? – gofr1

Смежные вопросы