0

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

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

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语法中尝试了不同数量的引号。看来我可以通过改变这些来绕过失败。上面的示例代码提供以下错误消息:

消息 102,级别 15,状态 1,第 2 行
“TMP_Table_Name_2000”附近的语法不正确。

我也试过用四个引号而不是两个。

另一种尝试是在没有@RunRW变量的情况下动态运行存储过程。那也没有用。

我做错了什么/遗漏了什么,或者无法sp_rename使用动态代码运行?

4

2 回答 2

4

您错过了两个表名的结束引号。如果你改变:

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

成为

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

它将消除错误。

于 2019-10-21T08:22:18.770 回答
0

如果你必须这样做,就个人而言,我会这样做。使用这些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.

于 2019-10-21T09:07:06.560 回答