我必须每月在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