You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中查询判断表是否为temporal表并获取其版本控制状态

C# 判断指定数据表是否为时态表(Temporal Table)的实现方案

1. 查询语句构造

SQL Server 中时态表的标识存储在系统视图sys.tables的temporal_type字段中,查询语句如下:

SELECT CASE WHEN temporal_type = 2 THEN 1 ELSE 0 END AS IsTemporal
FROM sys.tables 
WHERE name = @TableName 
AND schema_id = SCHEMA_ID(@SchemaName) -- 可默认填'dbo'

字段说明:

  • temporal_type = 0:非时态表
  • temporal_type = 1:时态表对应的历史归档表
  • temporal_type = 2:启用了系统版本控制的业务时态表,也就是通常需要判断的目标表类型

2. C# 实现代码

使用Microsoft.Data.SqlClient包实现的示例如下,最终判断结果会存储在布尔变量isTemporalTable中:

using Microsoft.Data.SqlClient;

// 配置参数
string connectionString = "你的数据库连接字符串";
string tableName = "要判断的表名";
string schemaName = "dbo"; // 替换为表所属的schema
bool isTemporalTable = false;

// 执行查询
using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    string querySql = @"
        SELECT CASE WHEN temporal_type = 2 THEN 1 ELSE 0 END AS IsTemporal
        FROM sys.tables 
        WHERE name = @TableName 
        AND schema_id = SCHEMA_ID(@SchemaName)
    ";
    using (SqlCommand cmd = new SqlCommand(querySql, conn))
    {
        // 参数化查询避免SQL注入
        cmd.Parameters.AddWithValue("@TableName", tableName);
        cmd.Parameters.AddWithValue("@SchemaName", schemaName);
        
        object result = cmd.ExecuteScalar();
        // 表存在且为时态表时赋值为true
        isTemporalTable = result != null && Convert.ToBoolean(result);
    }
}

// 后续直接使用isTemporalTable变量即可

3. 注意事项

  • 执行查询的数据库账号需要有系统视图sys.tables的查询权限
  • 必须指定表所属的schema,避免不同schema下存在同名表导致判断错误
  • 如果使用EF Core/其他ORM框架,可直接调用框架的原生SQL执行方法运行上述查询语句,逻辑完全一致

内容的提问来源于stack exchange,提问作者Dorian Daszkiewicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:48:00