Динамическое изменение нескольких имен таблиц в 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 + ''''
это устранит ошибку.