我有这个包含TODO项目的任务表。我们正在使用单个存储过程中的单独查询检索待办事项和完成,待处理任务的计数,即使它是从同一个表查询。这是查询,
select
TaskName 'Task/TaskName',
CASE IsDone WHEN '1' THEN 'True' ELSE 'False' END 'Task/IsDone',
(
SELECT COUNT(*) FROM Tasks WHERE IsDone = '1'
) 'CompletedCount'
FROM Tasks FOR XML PATH('Tasks')
这是输出
'<Tasks>
<Task>
<TaskName>Write a email to Mayor<TaskName>
<IsDone>True</IsDone>
<CompletedCount>2<CompletedCount>
</Task>
</Tasks>'
CompletedCount
出现在每个任务中,这是不必要的,无论如何我也可以查询计数而无需明确写出此SELECT COUNT(*) FROM Tasks WHERE IsDone = '1'
'<Tasks>
<CompletedCount>2<CompletedCount>
<Task>
<TaskName>Write a email to Mayor<TaskName>
<IsDone>True</IsDone>
</Task>
<Task>
<TaskName>Organize Campaign for website<TaskName>
<IsDone>False</IsDone>
</Task>
</Tasks>'
答案 0 :(得分:3)
select (
select count(*)
from Tasks
where IsDone = 1
for xml path('CompletedCount'), type
),
(
select TaskName,
case IsDone
when 1 then 'True'
else 'False'
end as IsDone
from Tasks
for xml path('Task'), type
)
for xml path('Tasks')
<强>更新强>
如果您首先构建任务列表,则可以使用单选,然后在XML中查询已完成的计数。我怀疑这会比使用两个select语句更快。
;with C(Tasks) as
(
select TaskName,
case IsDone
when 1 then 'True'
else 'False'
end as IsDone
from Tasks
for xml path('Task'), type
)
select C.Tasks.value('count(/Task[IsDone = "True"])', 'int') as CompletedCount,
C.Tasks
from C
for xml path('Tasks')
答案 1 :(得分:2)
您可以使用type
计算子查询中的部分XML:
declare @todo table (TaskName varchar(50), IsDone bit)
insert @todo values ('Buy milk',1)
insert @todo values ('Send thank you note',1)
select sum(case when isdone = 1 then 1 end) as 'CompletedCount'
, (
select TaskName 'TaskName'
, case when isdone = 1 then 'True' else 'False' end 'IsDone'
from @todo
for xml path('Task'), type
) as 'TaskList'
from @todo
for xml path('Tasks')
打印:
<Tasks>
<CompletedCount>2</CompletedCount>
<TaskList>
<Task>
<TaskName>Buy milk</TaskName>
<IsDone>True</IsDone>
</Task>
<Task>
<TaskName>Send thank you note</TaskName>
<IsDone>True</IsDone>
</Task>
</TaskList>
</Tasks>