<s s_sec="免疫室" s_ite="EB病毒抗体" >
<d D_det="EB病毒抗体" D_unit="" D_num=":" >
<ds Ds_nam="阳性" />
<ds Ds_nam="阴性" />
</d>
</s>
要形成这样的层次关系~~!!
谢谢,不会也帮我顶啊!!!
<d D_det="EB病毒抗体" D_unit="" D_num=":" >
<ds Ds_nam="阳性" />
<ds Ds_nam="阴性" />
</d>
</s>
要形成这样的层次关系~~!!
谢谢,不会也帮我顶啊!!!
SELECT
s.*,
d.[D_det], d.[D_unit], d.[D_num],
ds.Ds_nam
FROM(
SELECT DISTINCT
[s_sec], [s_ite]
FROM [Test]
)s
INNER JOIN(
SELECT DISTINCT
[s_sec], [s_ite], [D_det], [D_unit] = RTRIM([D_unit]), [D_num]
FROM [Test]
)d
ON s.[s_sec] = d.[s_sec]
AND s.[s_ite] = d.[s_ite]
INNER JOIN [Test] ds
ON ds.[s_sec] = d.[s_sec]
AND ds.[s_ite] = d.[s_ite]
AND ds.[D_det] = d.[D_det]
FOR XML AUTO
<d D_det="甲胎蛋白(AFP)" D_unit="ug/l" D_num="20:">
<ds />
</d>
</s>
<s s_sec="免疫室" s_ite="癌胚抗原(CEA)">
<d D_det="癌胚抗原(CEA)" D_unit="ug/l" D_num="15:">
<ds />
</d>
</s>
<s s_sec="免疫室" s_ite="EB病毒抗体">
<d D_det="EB病毒抗体" D_num=":">
<ds Ds_nam="阴性" />
<ds Ds_nam="阳性" />
<ds />
</d>
<d D_det="戊肝抗体IgG" D_num=":">
<ds />
</d>
<d D_det="IgM" D_unit="G/L" D_num="0.5:2.2">
<ds />
</d>
<d D_det="IgG" D_unit="G/L" D_num="8.0:16.0">
<ds />
</d>
<d D_det="补体C3" D_unit="g/l" D_num="0.8:1.6">
<ds />
</d>
<d D_det="补体C4" D_unit="g/l" D_num="0.1:0.4">
<ds />
</d>
</s>
<s s_sec="免疫室" s_ite="前列腺特异性抗原(PSA)">
<d D_det="前列腺特异性抗原(PSA)" D_unit="ug/L" D_num="0:4.0">
<ds />
</d>
<d D_det="戊肝抗体IgG" D_num=":">
<ds />
</d>
<d D_det="IgM" D_unit="G/L" D_num="0.5:2.2">
<ds />
</d>
<d D_det="IgG" D_unit="G/L" D_num="8.0:16.0">
<ds />
</d>
<d D_det="补体C3" D_unit="g/l" D_num="0.8:1.6">
<ds />
</d>
</s>
今年刚毕业,感觉要学的东西太多了,特别是数据库方面的,以后还找你问,哈哈!!
过滤<ds>我会啊,加hide就可以了.
本来我也不会去用EXPLICIT的,后来发现有些<d>标签检索时出不来,查来查去,发现一个致命的逻辑错误,s,d,ds三个表都是内联的,有些d在ds中是没有数据的,而页面上取XML数据的格式已经被我定死了改起来回很麻烦的[那个体检登记页面我做了一个礼拜],真的不想改了,只能专下牛角尖.
后来发现,我数据库的基础还是不怎么样啊,只要该为[左连接]就可以解决这个问题的.下面是我没改之前的存储过程:
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = N'sp_UTtemplete_xml'
AND type = 'P')
DROP PROCEDURE sp_UTtemplete_xml
GO
CREATE PROCEDURE sp_UTtemplete_xml
@t_hao varchar(40), --体检号
@d_hao varchar(40) --档案号
AS
DECLARE @Istr varchar(40), --项目集(以|分割的数据)
@Itype varchar(40) --类型
SET @Itype = (SELECT B_opt FROM B_check WHERE B_id = @t_hao AND R_id = @d_hao)
SET @Istr = (
CASE @Itype
WHEN '项' THEN (SELECT B_con FROM B_check WHERE B_id = @t_hao AND R_id = @d_hao)
WHEN '套' THEN (SELECT c.S_id FROM Ce_meal c,B_check b WHERE c.Ce_id = b.Ce_id AND B_id = @t_hao AND R_id = @d_hao)
WHEN '套+项' THEN (SELECT c.S_id + '|' + b.B_con FROM Ce_meal c,B_check b WHERE c.Ce_id = b.Ce_id AND B_id = @t_hao AND R_id = @d_hao)
ELSE '|' --防止无数据的错误
END
)SELECT s.s_sec, --科名
s.s_ite, --项目名称
d.D_det, --小项名称
d.D_unit, --单位
d.D_num, --数据范围
ds.Ds_nam --参考值
FROM S_item s,D_detail d,Ds_falues ds
WHERE s.s_id in (select * from dbo.f_splitstr(@Istr,'|'))
and s.s_id = d.S_id and d.D_id = ds.D_id
ORDER BY s.s_sec,s.s_ite,d.D_det
FOR XML AUTO
Go//-------------------------------
这样的存储过程还能改进吗?会不会有效率问题?哈哈,thank you! thank you!