使用 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
执行得更快。
我正在尝试使用 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
执行得更快。