【发布时间】:2016-09-12 12:10:56
【问题描述】:
我在 SQL Server 2008 中有 2 个表,分别称为“User”和“UserDetail”。主表“User”包含以下列
UserId Int,
UserDate DateTime,
ModifiedBy Int
“UserDetail”表包含以下列
UserId Int
,UserIdDetailId Int
,Amount Int
,Balance Int
User表包含如下数据
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
对于 User 表的第 3 行,它在 UserDetail 表中没有子记录。
现在我想使用 sp 从 User 和 UserDetail 表中检索记录
在前端asp.net中,我将xml框起来并传递给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]" />
sql sp中的openxml如下
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
我希望它按如下方式存储在#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,其中详细值为 NULL
我的问题是如何构建 OPENXML 以使用 OPENXML 中的联接从 User 和 UserDetail 表中获取所有记录,我对 OPENXML 及其联接不满意,但不知何故我希望它能够正确执行。强>
【问题讨论】:
-
现在我从明细表中获取所有 NULL
标签: c# sql asp.net sql-server