【问题标题】:How do I query tags from the TFS database?如何从 TFS 数据库中查询标签?
【发布时间】:2020-10-30 02:36:30
【问题描述】:

我正在为我们的 QA 团队编写一些自定义 SSRS 报告,我需要将测试用例“标签”添加到我的查询中。据我了解,这些不在 TFS_Warehouse 中。我在操作存储中找到了 dbo.tbl_TagDefinition,但不知道如何将其加入工作项。

【问题讨论】:

  • 您使用的是哪个版本的 TFS 和 VS?
  • 您应该直接查询操作存储。
  • 很多人说你不应该直接查询运营商店,这让我很困扰。我们在这里谈论的是生产级别的 MS SQL Server 实例,而不是用纸浆拼凑起来的快速数据库。我们不是程序员和技术人员吗?如果我们找到了做某事的方法,我们就会去做。直接查询店铺有什么风险? 1. 轻微的性能影响(对可以处理它的生产数据库) 2. 数据库可能会在版本之间发生变化。美好的。我们可以处理。当它发生变化时(在 2015 年到 2017 年间没有发生变化),我们将设计另一个解决方案。

标签: tfs


【解决方案1】:

如果您的 TFS 包含随 TFS 2013 Update 2 或更高版本添加的更新,您可以直接向工作项查询添加标签。

如果要从数据库中查询,请查看this case

TFS 2013 及更高版本:

SELECT DISTINCT workItem.ID, tbl_TagDefinition.Name
    --,tbl_PropertyValue.ArtifactId, *
FROM tbl_TagDefinition
    LEFT JOIN tbl_PropertyDefinition ON tbl_PropertyDefinition.Name = 'Microsoft.TeamFoundation.Tagging.TagDefinition.' + CONVERT(NVARCHAR(400), tbl_TagDefinition.TagId)
    LEFT JOIN tbl_PropertyValue ON tbl_PropertyValue.PropertyId = tbl_PropertyDefinition.PropertyId
    --LEFT JOIN WorkItemLongTexts ON WorkItemLongTexts.ID = tbl_PropertyValue.ArtifactId
    left join tbl_WorkItemCoreLatest workItem on WorkItemsAre.ID = tbl_PropertyValue.ArtifactId
WHERE 
    (
       SELECT SUM(CASE WHEN IntValue = 0 THEN 1 ELSE -1 END) NB 
       FROM tbl_PropertyValue PROP_CNT 
       WHERE PROP_CNT.PropertyId = tbl_PropertyDefinition.PropertyId 
          AND workItem.ID = PROP_CNT.ArtifactId
    ) > 0

在 TFS 2013 之前:

SELECT DISTINCT WorkItemsAre.ID, WorkItemsAre.Title, tbl_TagDefinition.Name
    --,tbl_PropertyValue.ArtifactId, *
FROM tbl_TagDefinition
    LEFT JOIN tbl_PropertyDefinition ON tbl_PropertyDefinition.Name = 'Microsoft.TeamFoundation.Tagging.TagDefinition.' + CONVERT(NVARCHAR(400), tbl_TagDefinition.TagId)
    LEFT JOIN tbl_PropertyValue ON tbl_PropertyValue.PropertyId = tbl_PropertyDefinition.PropertyId
    --LEFT JOIN WorkItemLongTexts ON WorkItemLongTexts.ID = tbl_PropertyValue.ArtifactId
    left join WorkItemsAre on WorkItemsAre.ID = tbl_PropertyValue.ArtifactId
WHERE 
    (
       SELECT SUM(CASE WHEN IntValue = 0 THEN 1 ELSE -1 END) NB 
       FROM tbl_PropertyValue PROP_CNT 
       WHERE PROP_CNT.PropertyId = tbl_PropertyDefinition.PropertyId 
          AND WorkItemsAre.ID = PROP_CNT.ArtifactId
    ) > 0

【讨论】:

  • 这是微软官方推荐的吗?我一直被告知,针对操作存储编写查询是不支持并且不应该这样做。
  • 官方建议永远不要查询操作存储。实际上,在某些情况下,API 或仓库适配器并不是很有吸引力。我们在查询测试用例步骤时遇到了同样的困境,我看到了很多非官方的建议,即只查询操作存储并为升级时可能出现的中断做好准备。
  • 谢谢@Cece!我去实现它,发现我们上周刚刚升级到 TFS2015,现在 dbo.workitemsare 不见了。 I posted a new question under TFS2015
  • 将 TFS2013 的 dbo.workitemsare 替换为 TFS2015 中的 dbo.tbl_WorkItemCoreLatest,并从此查询中删除 Title 列(这是来自 dbo.WorkItemCustomLatest 的关系)。如果有人回应并感到好奇,我将展示如何添加标题。
【解决方案2】:

TFS 2015 数据库令人费解,但这是查询标签以查找所有匹配工作项的方式

select * from tbl_WorkItemCoreLatest
where
    id in
    (
        select CONVERT(INT, artifactid) from tbl_PropertyValue
        where
        PropertyId in
            (
                select PropertyId from tbl_PropertyDefinition 
                where 
                name in
                    (
                        select ltrim(rtrim('Microsoft.TeamFoundation.Tagging.TagDefinition.' + cast(tagid as varchar(1000)))) 
                            from tbl_TagDefinition 
                                where name like '%<TAG NAME TO SEARCH FOR>%'  -- Tag name you're looking for
                    )
            )
    )

希望这会有所帮助:-)

TFS #TFS2015

-R

【讨论】:

    【解决方案3】:

    这是基于@Robby 的回答,并且似乎在 Azure DevOps 2019 中仍然有效:

       select distinct 
           wcl.id, 
           td.Name from tbl_WorkItemCoreLatest wcl
    left outer join tbl_PropertyValue pv on wcl.id = pv.artifactid
    left outer join tbl_PropertyDefinition pd on pv.PropertyId = pd.PropertyId
    left outer join tbl_TagDefinition td on pd.Name = ltrim(rtrim('Microsoft.TeamFoundation.Tagging.TagDefinition.' + cast(td.TagId as varchar(1000))))
    where td.Name is not null
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2017-11-16
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多