获取表的架构

Posted

技术标签:

【中文标题】获取表的架构【英文标题】:Getting the schema for a table 【发布时间】:2010-09-15 11:42:41 【问题描述】:

给定一个 SQLConnection 对象,如何获取单个表的架构?

前几天我在尝试这个,我似乎能够从运行查询获得的 DataSet 中获取架构,但是我可以从连接中获得的所有架构信息似乎都与表是可用的,而不是表上的实际详细信息。

我确信有一种简单的方法可以做到这一点。

【问题讨论】:

查看相关:***.com/q/4155993 【参考方案1】:

这段代码会做你想做的事(显然改变表名、服务器名等):

using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace ConsoleApp

    class Program
    
        static void Main(string[] args)
        
            string query = "SELECT * FROM t where 1=0";
            string connectionString = "initial catalog=test;data source=localhost;Trusted_Connection=Yes";

            DataTable tblSchema;

            using (SqlConnection cnn = new SqlConnection(connectionString))
            
                using (SqlCommand cmd = cnn.CreateCommand())
                
                    cmd.CommandText = query;
                    cmd.CommandType = CommandType.Text;
                    cnn.Open();
                    using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.KeyInfo))
                    
                        tblSchema = rdr.GetSchemaTable();
                    
                    cnn.Close();
                
            
            int numColumns = tblSchema.Columns.Count;
            foreach (DataRow dr in tblSchema.Rows)
            
                Console.WriteLine("0: 1", dr["ColumnName"], dr["DataType"]);
            

            Console.ReadLine();
        
    

【讨论】:

【参考方案2】:

我认为从查询中访问架构(通过 GetSchemaTable)是唯一的方法。 如果您只对架构感兴趣,则可以运行不返回任何行的查询(从 1=2 的表中选择 *)。

您应该使用 KeyInfo CommandBehaviour 来执行源查询,否则不能保证返回的所有信息都是准确的

Command.ExecuteReader(CommandBehavior.KeyInfo)

【讨论】:

【参考方案3】:

SQL Server - 查询目录视图...如果 SQL 2000 或更早版本,则为 sysobjects、syscolumns 等...如果 SQL 2005 或更高版本,则为 sys.objects、sys.columns 等。 (虽然旧视图仍然可用,但建议使用较新的视图)

此处完整参考: http://msdn.microsoft.com/en-us/library/ms189783.aspx

例子:

select so.name, sc.*
from sys.objects as so
inner join sys.columns as sc on sc.object_id = so.object_id
where so.name='some_table'

【讨论】:

我们可以为查询做些什么,而不仅仅是表?例如。 SELECT * FROM Table1 INNER JOIN Table2...

以上是关于获取表的架构的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法获取数据集中所有表的信息(架构详细信息)? (大查询)

如何设置表的架构以在 Google App Scripts 中自动检测从 Google Cloud Storage 获取数据?

如何通过 BigQuery 中的 WebUI 导出现有表的架构?

使用 bigquery 中的 bigquery select 语句的 JSON 格式的现有表的架构

BigQuery 代码段中的错误

BigQueryIO 读取获取 TableSchema