【问题标题】:Procedure to rename a list of procedure, only renames the last procedure in the list重命名过程列表的过程,仅重命名列表中的最后一个过程
【发布时间】:2018-09-24 00:31:10
【问题描述】:

我创建了一个过程,可以在其中传递以逗号分隔的过程名称列表,然后我想通过在末尾添加自定义后缀来重命名列表中的所有过程。

但我面临一个问题,它只会重命名列表中的最后一项,而忽略所有其余项。我不知道为什么它不会重命名表变量列表中的每一项,因为我在列表中的每一项上都调用了sp_rename

另外,我可以使用raiseerror() 打印每个循环

这是我编写的完整程序。

CREATE PROCEDURE [dbo].[Util_ProcRename]
    @ProcNameListWithComma VARCHAR(MAX)
AS
BEGIN
    DECLARE @ID INT
    SET @ID = 1;

    DECLARE @oldname varchar(200)
    DECLARE @newname varchar(200);

    DECLARE @NOTUSED VARCHAR(20)
    SET @NOTUSED = '_NOTUSED_'+REPLACE(CONVERT(varchar(20), GETDATE(), 101),'/','')

    DECLARE @ProList AS TABLE (
                           ID INT IDENTITY,
                           ProcName VARCHAR(200),
                           NewProcName VARCHAR(200)
                          );

    --Get proc names from a list into a table with ID to use in While loop
    INSERT INTO @ProList (ProcName)
        SELECT P AS ProcName
        FROM dbo.SplitText(@ProcNameListWithComma,',')

    WHILE (@id <= (SELECT MAX(ID) FROM @ProList)) 
    BEGIN  
        SET @oldname = (SELECT ProcName FROM @ProList WHERE ID = @ID)
        SET @newname = @oldname + @NOTUSED

        EXEC p_rename @oldname, @newname

        SET @ID = @ID + 1
    END

    UPDATE p
    SET NewProcName = p.ProcName+@NOTUSED
    FROM @ProList p
    WHERE ID = ID

    --TO see the list that got renamed 
    SELECT 
        a.Name AS [NewName], 
        a.type
    FROM  
        dbo.sysobjects a
    WHERE 
        name IN (SELECT NewProcName FROM @ProList)
END
GO

【问题讨论】:

  • 您可以通过将所有存储过程检查到源代码控制系统中来解决此问题,然后从服务器中删除您不使用的过程。
  • 我的公司不想删除任何东西,这就是为什么我需要重命名前缀_NOTUSED_
  • 在源代码管理中 == 未删除。
  • @EricBrandt 是的,我想念理解。

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


【解决方案1】:

尽管有缩进,但您正在执行update 循环之后。所以,它只被调用一次。

END 移到UPDATE 之后。

【讨论】:

  • 我也这么认为,但是(至少在问题中)是WHERE ID = ID,所以整个表格应该在一次调用中更新。不知实际代码中是不是WHERE ID = @ID
  • 我想要在循环之后使用它,因此拥有它 WHERE ID = ID,将更新表变量中的整个列表,然后我从 sysobjects 中提取信息以直观地比较我在调用中传递的列表proc和什么得到回报。问题是,当我执行 raiseerror 时,我打印了整个列表,但是当我使用 EXEC sp_rename 运行时,它只重命名了列表中的最后一个。
猜你喜欢
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 2013-07-06
相关资源
最近更新 更多