我正在尝试缩小从查询架构中返回的表的范围。虽然我可以取回所有表,但我在这里看到了其他问题,但他们没有关于找回用户的信息 用户定义的表,我想查询和
- 返回,用户定义的表
-
根据某些标准获取表,例如带有
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。 Columns
的Contains
方法可用于检查列名。 需要将对Microsoft.SqlServer.ConnectionInfo
和Microsoft.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);
}
}