在 LINQPad 中是否有任何方法可以使用 LINQ 访问 SYSOBJECTS 表或各种 INFORMATION_SCHEMA.xxx 视图?
我花了很多时间在我们庞大的公司数据库中搜索部分名称,因为表和存储过程太多,无法记住所有名称。
我知道我可以在 LINQPad 中输入和运行 SQL,但我想在 LINQ 而不是 SQL 中执行此操作,因为 LINQ 更有趣 :)
谢谢
黄原藻
是的你可以。
您所要做的就是在选定的连接中包含系统视图和 SP,并使用 LINQ,如下所示:
sys.Sysobjects.Where(sp => sp.Xtype == "P") // returns SPs
sys.Sysobjects.Where(t => t.Xtype == "U") // returns Tables
或直接使用 sys.Views [示例返回所有列包含字符串 "person" 的表]:
sys.Tables.Join(sys.Columns,
t => t.Object_id,
c => c.Object_id,
(t, c) => new { t, c })
.Where(x => x.c.Name.Contains("person"))
.Select(x => new { ObjName = x.t.Name,
ChildName = x.c.Name } )
.Distinct()
您还可以将 SQL 嵌入到您的 LINQ 语句中,如下所示:
void Main()
{
var matches = this.ExecuteQuery<SysObject>("SELECT name, type_desc AS "
+ "TypeDesc FROM [sys].[objects]");
foreach(var match in matches)
Console.WriteLine("{0,-30}{1}", (match.Name + ":"), match.TypeDesc);
}
// Define other methods and classes here
class SysObject
{
public string Name;
public string TypeDesc;
// etc...
}
默认情况下,LinqPad 不对结果使用等宽字体,但您可以通过将以下 css 粘贴到“编辑 -> 首选项 -> 结果 -> 启动编辑器”中轻松更改它
body { font-family:Consolas,等宽;}
from d in Databases
select d
当 LINQPad 中的数据库连接指向主数据库时。
使用 SYSOBJECTS 的内容创建一个新表,然后在新表中搜索
select * into SYSOBJECTS_COPY from SYS.OBJECTS
from o in SYSOBJECTS_COPY.AsEnumerable()
where Regex.IsMatch( d.Name, "partialName", RegexOptions.IgnoreCase )
select o
此代码还返回对象定义,并允许您根据需要在定义中进行搜索。
void Main()
{
var matches = FetchObjects(true);
var searchTerm = "tblName"; //<--Change this to filter for what you are looking for
bool searchName = true; //search the object name
bool searchDef = false; //search inside object definition (ie the stored procedure definition)
TypeDescs typeDesc = TypeDescs.Any; //specify whether you want to limit your search to tables or stored procedures
matches
.Where(x=> (
(searchName && x.Name.Contains(searchTerm))
|| (searchDef && (x.ObjectDefinition!=null && x.ObjectDefinition.Contains(searchTerm))) )
&& (typeDesc==TypeDescs.Any || x.TypeDesc == typeDesc.ToString())
)
.Select(x=> new {x}).Dump();
}
IEnumerable<SysObject> FetchObjects(bool includeDefinitions){
return this.ExecuteQuery<SysObject>("SELECT Name=convert(varchar(30), name), type_desc AS "
+ " TypeDesc "
+ string.Format(", ObjectDefinition={0}", (includeDefinitions)?"OBJECT_DEFINITION (OBJECT_ID(name))":"NULL")
+ " FROM [sys].[objects]");
}
enum TypeDescs {Any, SQL_STORED_PROCEDURE, USER_TABLE}
class SysObject
{
public string Name;
public string TypeDesc;
public string ObjectDefinition;
}
除了@Nick 的回答,这里有一个片段,它在markdown 中生成表格信息并在VS Code 中打开它。