如何获取用户定义的表



我正在尝试缩小从查询架构中返回的表的范围。虽然我可以取回所有表,但我在这里看到了其他问题,但他们没有关于找回用户的信息 用户定义的表,我想查询和

  1. 返回,用户定义的表
  2. 根据某些标准获取表,例如带有tenantId列的表

    public static List<string> GetUserCreatedTables(string connectionString = null)
    {
        if (string.IsNullOrEmpty(connectionString))
            connectionString = Settings.Default.ConnectionString;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            DataTable schema = connection.GetSchema("Tables");
            List<string> TableNames = new List<string>();
            foreach (DataRow row in schema.Rows)
            {
                TableNames.Add(row[2].ToString().Trim());
            }
            return TableNames;
        }
    }
    

我熟悉这种方法,可以直接查询。 SELECT Name from Sysobjects where xtype = 'u',但我想采用以前的方法,以便我可以重用它来查询其他人。

如果将 StructuredTypeMembers 而不是 Tables 传递给 GetSchema()它将返回用户定义的表类型及其列。

要获取筛选列表,您可以传入限制以GetSchema()结构化类型成员的限制包括目录所有者。它们按该顺序在数组中传递给 GetSchema() 的第二个参数。

若要获取具有 tenantId 列的用户定义表,可以按如下方式调用GetSchema()

connection.GetSchema("StructuredTypeMembers", (new[] { null, null, null, "tenantId"}));
您可以使用

SMO对象来验证表是否为用户创建的表和列名。 如下所述,IsSystemObject 属性为系统对象返回 true。 ColumnsContains方法可用于检查列名。 需要将对Microsoft.SqlServer.ConnectionInfoMicrosoft.SqlServer.SMO的引用添加到项目中,并引用Microsoft.SqlServer.Management.Smo命名空间。 要查看视图,请在第一个foreach循环中将Table对象更改为View对象。

using Microsoft.SqlServer.Management.Smo;
            Server serv = new Server(@"YourServer");
            //for Windows authentication
            serv.ConnectionContext.LoginSecure = true;
            serv.ConnectionContext.StatementTimeout = 600;
            Database db = serv.Databases["YourDatabase"];
            List<string> TableNames = new List<string>();
            foreach (Table t in db.Tables)
            {
                //check for system objects
                if (!t.IsSystemObject && t.Columns.Contains("tenantId"))
                {
                    //use the Name property to return the table name
                    TableNames.Add(t.Name);
                }
            }

最新更新