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

从不同的数据库重命名表和视图,在编辑器中工作,但不从存储过程中工作

  •  0
  • SoundWaves  · 技术社区  · 8 年前

    我必须每月在sql server中运行一个作业来重命名各种数据库中的表和视图。数据库名称存储在表中,此过程循环遍历它们。表名每月更改一次,因此我将根据当前日期连接表名。

    这对创建命令很有效。

    如果我改变我的 EXEC PRINT 并将结果粘贴到一个新的查询窗口中,效果很好。

    BW_Test.dbo.sp_rename 'BW_Test_DataLog_2018_05','BW_Test_DataLog_2018_06';
    BW_Test.dbo.sp_rename 'BW_Test_DataLog','BW_Test_DataLog_2018_05';
    

    但是,当我运行存储过程时,它会失败,并出现以下错误:

    错误号:2812错误消息:找不到存储过程'bw_test.dbo.sp_rename'bw_test_2018_05','bw_test_2018_06''

    这是存储过程,提前谢谢!

    BEGIN
        SET NOCOUNT ON;
    
        -- Find month and year to concatenate with table names
        DECLARE @RighNow DATE = GETDATE();
        DECLARE @LastMonth DATE = DATEADD(MONTH, -1, GETDATE());
    
        DECLARE @RenameView NVARCHAR(500);
        DECLARE @RenameTable NVARCHAR(500);
        DECLARE @LastMonthsName NVARCHAR(50);
        DECLARE @ThisMonthsName NVARCHAR(50);
    
        DECLARE @COUNTER INT = 0;
    
        DECLARE @MAX INT = (SELECT COUNT(*) FROM DatabaseNames)
        DECLARE @Machine VARCHAR(50);
    
        --Start Loop here
        WHILE @COUNTER < @MAX
        BEGIN
            SET @Machine = (SELECT DatabaseName 
                            FROM
                                (SELECT 
                                     (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) [index], 
                                     DatabaseName 
                                 FROM
                                     DatabaseNames) R 
                            ORDER BY R.[index] 
                                OFFSET @COUNTER ROWS FETCH NEXT 1 ROWS ONLY);
    
            SET @LastMonthsName = CONCAT(@Machine, '_DataLog', '_', YEAR(@LastMonth), '_', FORMAT(MONTH(@LastMonth), '00'));
            SET @ThisMonthsName = CONCAT(@Machine, '_DataLog', '_', YEAR(@RighNow), '_', FORMAT(MONTH(@RighNow), '00'));
    
            SET @RenameView = CONCAT(@Machine, '.dbo.sp_rename ', char(39), @LastMonthsName, char(39), ',', char(39), @ThisMonthsName, char(39), ';');
            SET @RenameTable = CONCAT(@Machine, '.dbo.sp_rename ', char(39), @Machine, '_DataLog', char(39), ',', char(39), @LastMonthsName, char(39), ';');
    
            BEGIN TRY  
                --IMPORTANT - Change the View first or you will have duplicate table names
                EXEC @RenameView
                EXEC @RenameTable
            END TRY         
            BEGIN CATCH  
                SELECT   
                    ERROR_NUMBER() AS ErrorNumber,
                    ERROR_MESSAGE() AS ErrorMessage;  
            END CATCH;
    
            SET @COUNTER = @COUNTER + 1
        END
    END  
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   marc_s MisterSmith    8 年前

    变化

    EXEC @RenameView
    EXEC @RenameTable
    

    到:

    EXEC (@RenameView)
    EXEC (@RenameTable)
    

    问题是 EXEC 实际上有两个不同的实现,一个用于动态sql(带括号),另一个用于过程(不带括号)。