代码之家  ›  专栏  ›  技术社区  ›  Kate

按名称删除存储过程组

  •  5
  • Kate  · 技术社区  · 16 年前

    我有一组名为“somename”的存储过程。有没有办法用一个查询删除那个SP,例如

    删除名称类似的过程 “%”

    .

    5 回复  |  直到 8 年前
        1
  •  8
  •   Martin Smith    16 年前

    这适用于MSSQL 2005+

    DECLARE @DropScript varchar(max)
    set @DropScript = ''
    
    SELECT @DropScript = @DropScript + 'DROP PROCEDURE [' + schema_name(schema_id)+ '].' + '[' + name + ']
    ' FROM sys.procedures
    where name like 'somename_%'
    
    
    exec (@DropScript)
    
        2
  •  2
  •   Jeffrey Kemp    16 年前

    您可以通过查询数据字典来生成ddl。例如,在Oracle中:

    SELECT 'DROP PROCEDURE "'||owner||'"."'||object_name||'";'
    FROM all_procedures
    WHERE procedure_name IS NULL
    AND lower(object_name) LIKE 'somename_%';
    
        3
  •  0
  •   Joel Goodwin    16 年前

    我总是倾向于这样做的方式是,使用critierion从系统表中提取列表过程,然后创建命令列表,或者直接在sql中创建,例如。 SELECT 'DROP PROCEDURE ' + procName FROM system_procedures_table WHERE procName like... 或者在Excel中。

        4
  •  0
  •   ebis    16 年前

    在MS U SQL-SERVER中,您可以使用“for XML path('')”子句创建一个语句,其中包含所有相关过程以供删除(AB)……

    BEGIN TRANSACTION;
    GO
    CREATE PROC Test_1  AS
    BEGIN;
      PRINT '1'
    END;
    GO
    CREATE PROC Test_2  AS
    BEGIN;
      PRINT '2'
    END;
    GO
    SELECT * FROM sys.objects WHERE name LIKE 'Test%'  AND   TYPE = 'P';
    DECLARE @Stmt NVARCHAR(MAX);
    SET @Stmt = ( SELECT 'DROP PROC ' + STUFF (x.Stmt, 1, 2, SPACE(0))
                  FROM  (SELECT ', ' + SCHEMA_NAME(Obj.Schema_ID) + CHAR(46) + Obj.Name
                         FROM   sys.objects AS Obj
                         WHERE  Obj.name LIKE 'Test%' 
                          AND   obj.TYPE = 'P'
                         FOR XML PATH ('')
                        ) AS X (Stmt)
                );
    SELECT @Stmt;
    EXEC sp_ExecuteSQL @Stmt;
    SELECT * FROM sys.objects WHERE name LIKE 'Test%'  AND   TYPE = 'P';
    ROLLBACK;