如何在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
相关产品推荐
相关产品推荐

