Динамическое изменение нескольких имен таблиц в SQL Server с помощью процедуры sp_rename

Я пытаюсь изменить ряд имен таблиц в Microsoft SQL Server 2017 Standard edition с помощью Microsoft SQL Server Management Studio 2018.

Код, который я передал, основан на следующем коде:

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, уровень 15, состояние 1, строка 2
Неправильный синтаксис рядом с "TMP_Table_Name_2000".

Я также пробовал использовать четыре кавычки вместо двух.

Еще одна попытка заключалась в том, чтобы динамически запустить хранимую процедуру, как есть, без @RunRWпеременная. Это тоже не сработало.

Что я делаю не так / не хватает или не могу запустить sp_rename с динамическим кодом?

2 ответа

Решение

Если вы должны сделать это лично, я бы сделал это так. Используя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.

Вы пропустили заключительную кавычку в обоих именах таблиц. Если вы измените:

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

быть

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

это устранит ошибку.

Другие вопросы по тегам