使用 sp_rename 动态更改 SQL 服务器中的多个 table 名称

Change multiple table names in SQL Server using sp_rename dynamically

我正在尝试使用 Microsoft SQL Server Management Studio 2018 在 Microsoft SQL Server 2017 标准版中更改一系列 table 名称。

我一直在传输的代码基于以下代码:

use DatabaseX

declare @RunRW varchar(MAX)
declare @ArVC varchar(4)
declare @StartAr smallint
declare @SlutAr smallint
declare @Ar smallint

set @StartAr = 2000
set @SlutAr = 2018
set @Ar = @StartAr

while @Ar <= @SlutAr
begin
    set @ArVC = cast(@Ar as varchar)

    set @RunRW = '
        exec sp_rename ''TMP_Table_Name_' + @ArVC + ',''Table_Name_' + @ArVC + ''

    exec (@RunRW)

    set @Ar = @Ar + 1
end

我在 exec sp_rename 语法中尝试了不同数量的引号。看来我可以通过更改这些来解决故障。上面的示例代码传递以下错误消息:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'TMP_Table_Name_2000'.

我也试过用四个引号代替两个引号。

另一种尝试是 运行 存储过程动态地像它一样,没有 @RunRW 变量。那也没用。

我在做什么 wrong/missing 还是无法使用动态代码 运行 sp_rename

您错过了 table 两个名字的结束语。如果你改变:

set @RunRW = '
        exec sp_rename ''TMP_Table_Name_' + @ArVC + ',''Table_Name_' + @ArVC + ''

成为

set @RunRW = '
    exec sp_rename ''TMP_Table_Name_' + @ArVC + ''',''Table_Name_' + @ArVC + ''''

它将消除错误。

如果你必须这样做,就我个人而言,我会这样做。使用 sys 对象,您只能影响存在的对象(这意味着如果 2018 不存在则没有错误),并且您正确地引用了这些值。由于您也只是从一开始就删除了 'TMP_',因此您可以使用 STUFF 将这些字符替换为 '':

DECLARE @Start int = 2000,
        @End int = 2018;

DECLARE @SQL nvarchar(MAX);


SET @SQL = (SELECT STRING_AGG(N'EXEC sp_rename N' + QUOTENAME(s.[name] + N'.' + t.[name],'''') + N',N' + QUOTENAME(STUFF(t.[name],1,4,''),'''') + N';',NCHAR(13) + NCHAR(10))
            FROM sys.schemas s
                 JOIN sys.tables t ON s.schema_id = t.schema_id
            WHERE t.[name] LIKE N'TMP_Table_Name_[0-9][0-9][0-9][0-9]'
              AND TRY_CONVERT(int,RIGHT(t.[name],4)) BETWEEN @Start AND @End)

PRINT @SQL; --Your best friend.
EXEC sys.sp_executesql @SQL;

这也可能比 WHILE 执行得更快。