开发者社区> 问答> 正文

在 SQL Server 中查找对象(跨数据库)

在 SQL Server 中查找对象(跨数据库)

展开
收起
贺贺_ 2019-12-04 21:47:24 424 0
1 条回答
写回答
取消 提交回答
  • 有一个Information_Schema架构,它是对 SYS 架构中的表的一组视图,您可以查询这些视图以获取所需的内容。 Information_Schema的缺点是必须为每种类型的对象编写一个查询。好处是,Information_Schema也更友好地阅读。 Sys 架构最初看起来有点神秘,但它在单个位置具有相同的信息。 基本上,每个数据库中都有一个名为 SysObjects 的表,该表具有所有对象及其类型的名称。 因此,您需要在数据库中搜索如下:

    Select [name] as ObjectName, Type as ObjectType
    From Sys.Objects
    Where 1=1
    and [Name] like '%YourObjectName%'
    现在,如果要将此限制为仅搜索表和存储的 procs,则可以执行
    Select [name] as ObjectName, Type as ObjectType
    From Sys.Objects
    Where 1=1
    and [Name] like '%YourObjectName%'
    and Type in ('U', 'P')
    
    

    如果查找对象类型,将查找视图、触发器等的完整列表。 现在,如果要在每个数据库中搜索此数据,则必须遍迭代数据库。您可以执行以下操作之一: 如果要在没有任何子句的情况下搜索每个数据库,请使用sp_MSforeachdb,如此处的答案所示。 如果只想搜索特定数据库,请使用"USE DBName",然后搜索命令。 在这种情况下,您将从参数化中获益匪浅。请注意,您搜索的数据库的名称必须在每个查询中替换(数据库一、数据库二...)。看看这个:

    Declare @ObjectName VarChar (100)
    
    Set @ObjectName = '%Customer%'
    
    Select 'DatabaseOne' as DatabaseName, [name] as ObjectName, Type as ObjectType
    From DatabaseOne.Sys.Objects
    Where 1=1
    and [Name] like @ObjectName
    and Type in ('U', 'P')
    UNION ALL
    Select 'DatabaseTwo' as DatabaseName, [name] as ObjectName, Type as ObjectType
    From DatabaseTwo.Sys.Objects
    Where 1=1
    and [Name] like @ObjectName
    and Type in ('U', 'P')
    UNION ALL
    Select 'DatabaseThree' as DatabaseName, [name] as ObjectName, Type as ObjectType
    From DatabaseThree.Sys.Objects
    Where 1=1
    and [Name] like @ObjectName
    and Type in ('U', 'P')
    
    2019-12-04 21:48:02
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载