Изменение нескольких имен таблиц в SQL Server с использованием динамического sp_rename - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь изменить серию имен таблиц в 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. Кажется, что я могу обойти неудачу, изменив их. Приведенный выше пример кода выдает сообщение об ошибке:

Сообщение 102, уровень 15, состояние 1, строка 2
Неверный синтаксис рядом с 'TMP_Table_Name_2000'.

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

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

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

Ответы [ 2 ]

4 голосов
/ 21 октября 2019

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

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

на

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

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

0 голосов
/ 21 октября 2019

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

...