查询TFS2015本地工作项中标签的使用次数
解决TFS2015中查询标签及工作项使用次数的问题
我明白你在直接查询TFS数据库时遇到的困扰——尤其是因为TFS会保留工作项的历史状态,导致之前的查询可能把已经移除标签的旧版本也算进去了,结果自然和实际不符。下面我分别提供数据库查询和REST API两种可行的方案:
一、数据库查询方案(仅针对TFS2015,注意官方不支持直接操作数据库,建议只做查询)
要准确获取当前工作项关联的标签,需要关联tbl_WorkItemCoreLatest(最新工作项)、tbl_TagDefinition(标签定义)和tbl_WorkItem_Tag(工作项与标签的关联表),而不是用tbl_PropertyDefinition——因为标签在TFS里是单独的关联表存储的,不是普通属性。
这里的关键是只取最新状态的工作项标签关联,避免历史数据干扰:
SELECT td.Name AS TagName, COUNT(DISTINCT wic.WorkItemID) AS WorkItemCount FROM tbl_TagDefinition td LEFT JOIN tbl_WorkItem_Tag wit ON td.TagID = wit.TagID LEFT JOIN tbl_WorkItemCoreLatest wic ON wit.WorkItemID = wic.WorkItemID WHERE wic.TeamProjectID IS NOT NULL -- 排除已删除的项目中的工作项 GROUP BY td.Name ORDER BY WorkItemCount DESC;
解释一下:
tbl_WorkItem_Tag是工作项和标签的中间关联表,直接关联标签ID和工作项IDtbl_WorkItemCoreLatest确保我们只取每个工作项的最新版本,不会包含历史上曾经有过该标签但现在已经移除的情况- 用
LEFT JOIN可以统计出那些还没有被任何工作项使用的标签(如果需要的话),如果只想看有使用的标签,把LEFT JOIN改成INNER JOIN即可
二、REST API方案(更推荐,符合官方最佳实践)
TFS2015支持REST API来查询标签和关联的工作项,这种方法不需要直接操作数据库,也不会受到历史数据的影响。
步骤1:获取所有标签列表
首先调用API获取项目中的所有标签(如果是全服务器范围,需要调整URL):
GET http://<你的TFS服务器地址>/tfs/<集合名称>/_apis/tagging/tags?api-version=1.0
返回的结果会包含每个标签的name和id。
步骤2:统计每个标签的工作项数量
对于每个标签,调用工作项查询API,筛选包含该标签的工作项,然后获取总数:
GET http://<你的TFS服务器地址>/tfs/<集合名称>/_apis/wit/wiql?api-version=1.0
请求体(JSON格式):
{ "query": "SELECT [System.Id] FROM WorkItems WHERE [System.Tags] CONTAINS '<标签名称>'" }
返回的结果里的workItems数组长度就是该标签的使用次数。如果要批量处理,可以写个简单的脚本(比如PowerShell或者Python)来遍历所有标签,自动执行查询并统计。
举个PowerShell脚本的例子(简化版):
$tfsUrl = "http://你的TFS服务器地址/tfs/集合名称" $apiVersion = "1.0" # 获取所有标签 $tags = Invoke-RestMethod -Uri "$tfsUrl/_apis/tagging/tags?api-version=$apiVersion" -Method Get -UseDefaultCredentials # 遍历标签统计 foreach ($tag in $tags.value) { $wiqlQuery = @" { "query": "SELECT [System.Id] FROM WorkItems WHERE [System.Tags] CONTAINS '$($tag.name)'" } "@ $result = Invoke-RestMethod -Uri "$tfsUrl/_apis/wit/wiql?api-version=$apiVersion" -Method Post -Body $wiqlQuery -ContentType "application/json" -UseDefaultCredentials Write-Host "标签 '$($tag.name)' 关联的工作项数量: $($result.workItems.Count)" }
这个脚本会自动统计每个标签的工作项使用次数,结果和你在TFS界面看到的完全一致,因为它查询的是当前状态的工作项。
内容的提问来源于stack exchange,提问作者W. Siegmund
相关产品推荐
相关产品推荐

