代码之家  ›  专栏  ›  技术社区  ›  Michael Wilson

Sybase“删除过程”。我能让它接受一个参数而不是一个裸进程名吗?

  •  1
  • Michael Wilson  · 技术社区  · 16 年前

    星期一快乐O/

    我想在存储过程中执行以下操作

      select @parameter="fooproc"
      drop procedure @parameter
    

    而不是

      drop procedure fooproc
    

    但它因语法错误而令人窒息。我有什么办法可以让这个屈从于我的意志吗?我本以为能做到这一点的。

    我尝试了一些@parameter类型声明的排列,但没有用。

    思想?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Cade Roux    16 年前

    仅使用动态SQL:

    DECLARE @sql AS VARCHAR(2000)
    
    SELECT @sql = STR_REPLACE('drop procedure {@parameter}', '{@parameter}', @parameter)
    
    EXEC ( @sql )
    

    我喜欢在这样做之前根据数据库元数据验证对象名。这可以防止在后面的动态部分中出现错误,甚至是注入错误。

    例如:

    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = @parameter)
    BEGIN
        DECLARE @sql AS VARCHAR(2000)
        SELECT @sql = STR_REPLACE('drop procedure {@parameter}', '{@parameter}', @parameter)
        EXEC ( @sql )
    END
    
        2
  •  0
  •   Calvin Allen    16 年前
    EXECUTE IMMEDIATE 'drop procedure ' || @parameter;
    
    推荐文章