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

如何捕获SQL Server中sp_columns的执行结果以获取表结构?

如何捕获SQL Server中sp_columns的执行结果

嘿,很高兴能帮你解决这个问题!你已经定义了ResultSchema类来接收sp_columns的返回结果,接下来只需要用ADO.NET或者轻量ORM工具(比如Dapper)来执行存储过程并完成结果映射就行,我给你两种常用的实现方案:

方案一:原生ADO.NET手动映射

这是最基础的实现方式,不需要额外依赖第三方库,完全用.NET自带的System.Data.SqlClient组件:

using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;

// 先补全你的ResultSchema类,把sp_columns返回的所有列都对应上
public class ResultSchema
{
    public object TABLE_QUALIFIER { get; set; }
    public object TABLE_OWNER { get; set; }
    public object TABLE_NAME { get; set; }
    public object COLUMN_NAME { get; set; }
    public object DATA_TYPE { get; set; }
    public object TYPE_NAME { get; set; }
    public object PRECISION { get; set; }
    public object LENGTH { get; set; }
    public object SCALE { get; set; }
    public object RADIX { get; set; }
    public object NULLABLE { get; set; }
    public object REMARKS { get; set; }
    public object COLUMN_DEF { get; set; }
    public object SQL_DATA_TYPE { get; set; }
    public object SQL_DATETIME_SUB { get; set; }
    public object CHAR_OCTET_LENGTH { get; set; }
    public object ORDINAL_POSITION { get; set; }
    public object IS_NULLABLE { get; set; }
}

public class TableSchemaReader
{
    public List<ResultSchema> GetTableColumns(string connectionString, string tableName)
    {
        var columnList = new List<ResultSchema>();

        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // 初始化存储过程命令
            using (var command = new SqlCommand("sp_columns", connection))
            {
                command.CommandType = CommandType.StoredProcedure;
                // 添加表名参数,sp_columns会根据这个参数返回对应表的结构
                command.Parameters.AddWithValue("@table_name", tableName);

                // 执行命令并读取结果
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var schema = new ResultSchema
                        {
                            TABLE_QUALIFIER = reader["TABLE_QUALIFIER"],
                            TABLE_OWNER = reader["TABLE_OWNER"],
                            TABLE_NAME = reader["TABLE_NAME"],
                            COLUMN_NAME = reader["COLUMN_NAME"],
                            DATA_TYPE = reader["DATA_TYPE"],
                            TYPE_NAME = reader["TYPE_NAME"],
                            PRECISION = reader["PRECISION"],
                            LENGTH = reader["LENGTH"],
                            SCALE = reader["SCALE"],
                            RADIX = reader["RADIX"],
                            NULLABLE = reader["NULLABLE"],
                            REMARKS = reader["REMARKS"],
                            COLUMN_DEF = reader["COLUMN_DEF"],
                            SQL_DATA_TYPE = reader["SQL_DATA_TYPE"],
                            SQL_DATETIME_SUB = reader["SQL_DATETIME_SUB"],
                            CHAR_OCTET_LENGTH = reader["CHAR_OCTET_LENGTH"],
                            ORDINAL_POSITION = reader["ORDINAL_POSITION"],
                            IS_NULLABLE = reader["IS_NULLABLE"]
                        };
                        columnList.Add(schema);
                    }
                }
            }
        }

        return columnList;
    }
}

方案二:用Dapper自动映射(更简洁)

如果你不想手动写映射代码,可以用Dapper这个轻量ORM,它会自动将查询结果映射到你的ResultSchema类,代码量大大减少:

首先需要通过NuGet安装Dapper包:Install-Package Dapper(或者在Visual Studio的NuGet包管理器里搜索安装)

然后实现代码:

using Dapper;
using System.Collections.Generic;
using System.Data.SqlClient;

// 同样确保你的ResultSchema类属性名和sp_columns返回列名完全匹配
public class ResultSchema
{
    public object TABLE_QUALIFIER { get; set; }
    public object TABLE_OWNER { get; set; }
    public object TABLE_NAME { get; set; }
    public object COLUMN_NAME { get; set; }
    public object DATA_TYPE { get; set; }
    public object TYPE_NAME { get; set; }
    public object PRECISION { get; set; }
    // 其他剩余属性补全...
}

public class TableSchemaReader
{
    public List<ResultSchema> GetTableColumns(string connectionString, string tableName)
    {
        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            // Dapper会自动匹配属性名和列名,直接返回映射后的列表
            return connection.Query<ResultSchema>(
                "sp_columns", 
                new { table_name = tableName }, 
                commandType: CommandType.StoredProcedure
            ).ToList();
        }
    }
}

几个关键注意事项

  • 属性名匹配:不管用哪种方式,ResultSchema类的属性名必须和sp_columns返回的列名完全一致(包括下划线),否则映射会失败;
  • 类型优化:你可以把object类型改成更具体的可空值类型,比如int? DATA_TYPE、string COLUMN_NAME,这样代码更健壮,避免后续类型转换的麻烦;
  • 参数扩展:sp_columns还支持@table_owner(架构名)、@table_qualifier(数据库名)等参数,如果你需要查询特定架构或数据库下的表,可以在命令中添加这些参数;
  • 异常处理:实际使用时建议添加try-catch块处理数据库连接、执行过程中可能出现的异常,比如连接失败、表不存在等情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:52:18