【问题标题】:Get the database name in which Stored Procedure exists获取存储过程所在的数据库名称
【发布时间】:2015-05-26 06:12:56
【问题描述】:

我有 SQL Server 2008,我有 10 个不同的数据库,现在我想搜索一个存储过程,该存储过程存在于哪个数据库中。

有些人提到重复......没有正确阅读我的问题。我的要求是我需要验证“SP_Email”程序。我这个程序是哪个数据库存在的。

【问题讨论】:

    标签: sql-server database sql-server-2008 tsql stored-procedures


    【解决方案1】:

    你可以试试这个:

    EXEC sp_msforeachdb 
    'if exists(select 1 from [?].sys.objects where name=''SP_Email'')
    select ''?'' as FoundInDatabase from [?].sys.objects where name=''SP_Email'''
    

    【讨论】:

    • SELECT * FROM sys.objects 将只检查下拉选择的数据库,而不是所有数据库。
    • @Dinehalla:- 这个查询工作得很好。经过测试和验证!
    • 是的,我试过它显示命令已成功完成。我应该做什么。请更新您的查询
    • @Dineshalla:- 单击结果窗口的结果选项卡! :) 你会在那里找到数据库名称
    • 不,它只显示消息选项卡。您使用的是哪个版本。
    【解决方案2】:

    请试试这个。

    SELECT name DatabaseName
    FROM sys.databases
    WHERE OBJECT_ID(QUOTENAME(name) + '.dbo.ProcedureNameHere', 'P') IS NOT NULL;
    

    这将返回此特定对象所在的数据库名称。

    ProcedureNameHere 替换为您的过程名称。在您的情况下,它将是 SP_Email 保持其余部分不变。

    【讨论】:

      【解决方案3】:

      您需要查询主数据库的sys.databases 以获取数据库列表,对于您获得的每个数据库名称,您需要查询db_name.sys.procedures 以检查它是否存在。

      尝试以下查询并提供反馈:

      use master
      go
      declare @FullQuery varchar(max)
      declare @DBName varchar(50)
      set @FullQuery=''
      declare cr cursor for select name from sys.databases where database_id > 4
      open cr
      fetch next from cr into @DBName
      while(@@fetch_status=0)
      begin
      set @FullQuery=@FullQuery+
          ' select name  COLLATE SQL_Latin1_General_CP1_CI_AS from '+@DBName+'.sys.procedures where name like ''%proc_name%'' union'
      fetch next from cr into @DBName
      end
      close cr
      deallocate cr
      set @FullQuery=substring(@FullQuery,1,len(@FullQuery)-5)
      exec (@FullQuery)
      

      【讨论】:

      • 我必须搜索所有数据库。
      • 不,请稍等,我会给出完整的查询,我很着急发帖(在最初编辑问题之前发布)
      • 是的,我会等你的回答
      • Msg 468, Level 16, State 9, Line 1 无法解决 UNION 操作中“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AI”之间的排序规则冲突。
      • @RahulTripathi,你是对的,但我没有使用 sp_msforeachdb ,因为你已经使用了它,我不想复制
      【解决方案4】:
      SELECT OBJECT_ID('DataBase1.SchemaName.StoredProcedureName') / 
      OBJECT_ID('DataBase2.SchemaName.StoredProcedureName') / 
      OBJECT_ID('DataBase3.SchemaName.StoredProcedureName') /
      ...
      

      如果没有这样的过程,它将返回NULL。如果所有数据库都在同一个实例上,这将起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 2018-09-15
        • 2015-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多