You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL Server查询:判断订阅关联密钥是否全部转换

解决方案:判断SubscriptionKey关联密钥是否全部转换并禁用GridView行

针对你的需求,我分成SQL查询获取转换状态GridView行禁用处理两部分来给你具体方案:

一、SQL Server查询:获取每个SubscriptionKey的全转换状态

首先需要从两张表关联查询,统计每个SubscriptionKey下是否所有guardkey的IsConverted都为True。这里用分组统计的方式,同时返回一个便于后续判断的标识字段:

SELECT 
    s.Id,
    s.SubscriptionKey,
    -- 直观显示转换状态
    CASE 
        WHEN COUNT(g.id) = 0 THEN '无关联密钥'
        WHEN SUM(CASE WHEN g.IsConverted = 0 THEN 1 ELSE 0 END) = 0 THEN '全部已转换'
        ELSE '存在未转换密钥'
    END AS ConversionStatus,
    -- 布尔标识,1=全部转换,0=未全部转换(方便代码判断)
    CAST(
        CASE 
            WHEN COUNT(g.id) = 0 THEN 0 -- 无密钥的情况可根据你的业务调整为1或0
            WHEN SUM(CASE WHEN g.IsConverted = 0 THEN 1 ELSE 0 END) = 0 THEN 1
            ELSE 0
        END AS BIT
    ) AS IsFullyConverted
FROM subscription s
LEFT JOIN guardkey g ON s.SubscriptionKey = g.SubscriptionKey
GROUP BY s.Id, s.SubscriptionKey

说明:

  • LEFT JOIN确保所有subscription表的记录都能被查询到,哪怕没有关联的guardkey
  • 通过SUM(CASE...)统计未转换的密钥数量,数量为0则说明全部转换完成
  • IsFullyConverted是BIT类型,后续在代码里判断会更方便

如果你的数据库是区分大小写的(默认不区分),可以把判断条件改成LOWER(g.IsConverted) = 'false'来兼容大小写不同的True/true值。

二、GridView绑定后禁用对应行

假设你用的是ASP.NET的GridView,绑定上面的查询结果后,通过RowDataBound事件来处理行禁用逻辑:

后台C#代码:

protected void YourGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // 只处理数据行,忽略表头/页脚行
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // 从数据源获取IsFullyConverted的值
        bool isAllConverted = Convert.ToBoolean(DataBinder.Eval(e.Row.DataItem, "IsFullyConverted"));
        
        if (isAllConverted)
        {
            // 禁用整行
            e.Row.Enabled = false;
            // 添加CSS样式,让禁用行视觉上更明显
            e.Row.CssClass = "disabled-row";
        }
    }
}

前端CSS(可选):

给禁用的行添加灰色背景和禁止光标,提升用户体验:

.disabled-row {
    background-color: #f5f5f5;
    cursor: not-allowed;
    opacity: 0.7;
}

这样处理后,当某个SubscriptionKey的所有密钥都已转换时,对应的GridView行就会被禁用,并且样式变灰,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Glory Raj

火山引擎 最新活动