【问题标题】:SQL Server -- search through stored procedures? [duplicate]SQL Server——搜索存储过程? [复制]
【发布时间】:2011-06-03 11:05:53
【问题描述】:

我正在开发一个包含数百个存储过程的 SQL Server 数据库。我希望能够搜索查询的 textNOT 结果)来查找已经存在的存储过程列表。例如,如果我需要创建一个新的存储过程,我可能想要搜索所有处理表 MyTable 的现有存储过程,以查看是否已经存在类似(甚至相同)的存储过程。有没有办法搜索字符串“MyTable”并最终得到包含“MyTable”的所有存储过程的列表?

【问题讨论】:

  • 哎呀!违背我一贯的政策,我没有先寻找答案……表示这一次它存在。谢谢大家!

标签: sql-server stored-procedures


【解决方案1】:
CREATE PROC [dbo].[Search_Stored_Procedure_Code]
(
    @SearchStr  varchar(100),
    @RowsReturned   int = NULL  OUT
)
AS
BEGIN
    SET NOCOUNT ON

    SELECT  DISTINCT USER_NAME(o.uid) + '.' + OBJECT_NAME(c.id) AS 'Object name',
        CASE 
            WHEN OBJECTPROPERTY(c.id, 'IsReplProc') = 1 
                THEN 'Replication stored procedure'
            WHEN OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1 
                THEN 'Extended stored procedure'                
            WHEN OBJECTPROPERTY(c.id, 'IsProcedure') = 1 
                THEN 'Stored Procedure' 
            WHEN OBJECTPROPERTY(c.id, 'IsTrigger') = 1 
                THEN 'Trigger' 
            WHEN OBJECTPROPERTY(c.id, 'IsTableFunction') = 1 
                THEN 'Table-valued function' 
            WHEN OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1 
                THEN 'Scalar-valued function'
            WHEN OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1 
                THEN 'Inline function'  
        END AS 'Object type',
        'EXEC sp_helptext ''' + USER_NAME(o.uid) + '.' + OBJECT_NAME(c.id) + '''' AS 'Run this command to see the object text'
    FROM    syscomments c
        INNER JOIN
        sysobjects o
        ON c.id = o.id
    WHERE   c.text LIKE '%' + @SearchStr + '%'  AND
        encrypted = 0               AND
        (
        OBJECTPROPERTY(c.id, 'IsReplProc') = 1      OR
        OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1  OR
        OBJECTPROPERTY(c.id, 'IsProcedure') = 1     OR
        OBJECTPROPERTY(c.id, 'IsTrigger') = 1       OR
        OBJECTPROPERTY(c.id, 'IsTableFunction') = 1 OR
        OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1    OR
        OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1    
        )

    ORDER BY    'Object type', 'Object name'

    SET @RowsReturned = @@ROWCOUNT
END

要在数据库中搜索关键字“FlowerOrders”并查找命中数:

DECLARE @Hits int
EXEC Search_Stored_Procedure_Code 'FlowerOrders', @Hits OUT
SELECT 'Found ' + LTRIM(STR(@Hits)) + ' object(s) containing this keyword' AS Result 

【讨论】:

  • 不要在 SQL Server 2005+ 上使用 syscomments 执行此任务。它可能会在定义 > 4000 个字符时失败
  • 为什么不使用o.typeo.xtype
【解决方案2】:

Redgate 制作了一套包含搜索工具的工具。您可能会发现它很有用。

【讨论】:

    【解决方案3】:

    您可以使用 SSMS 插件 ObjectFinder 对存储过程执行全文搜索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-14
      • 2016-10-15
      • 1970-01-01
      • 2019-01-21
      • 2013-01-20
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      相关资源
      最近更新 更多