2017-11-18 43 views
1

我需要遍历所有以特定前缀开头的表来重命名它们。我试过的代码在下面,但是它以两个结果中的一个结束,或者崩溃了SSMS(有时),或者我得到了每个表下面的错误消息。我用dbo试过。遍历并重命名所有带有对象限定符的表MSSQL

任何人都可以告诉我我做错了什么或者建议更好的方法来做到这一点?

No item by the name of 'dbo.prefix_TableName' could be found in the current database 'DatabaseName', given that @itemtype was input as '(null)'.

以下是我正在运行的代码......

SET NOCOUNT ON; 
USE [DatabaseName]; 

DECLARE @oq NVARCHAR(5), @tableName NVARCHAR(128), @newTableName NVARCHAR(128); 
SET @oq = N'prefix_'; 

/* 
    find and rename all tables 
*/ 

DECLARE [tableCursor] CURSOR FOR 
    SELECT [TABLE_NAME] FROM INFORMATION_SCHEMA.TABLES 
    WHERE [TABLE_TYPE] = 'BASE TABLE' AND [TABLE_NAME] LIKE @oq + '%' 
    ORDER BY [TABLE_NAME]; 

OPEN [tableCursor] 

FETCH NEXT FROM [tableCursor] INTO @tableName 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @newTableName = REPLACE(@tableName, @oq, N''); 
    EXEC('EXEC sp_rename ''dbo.' + @tableName + ''', ''' + @newTableName + ''''); 
END 

CLOSE [tableCursor]; 
DEALLOCATE [tableCursor]; 
+2

你错过了while循环中的一个FETCH语句 – Squirrel

+0

谢谢@Squirrel ...这是问题。你应该把它作为答案。 –

回答

0

没有游标

declare @oq nvarchar(max) = N'prefix_' 
declare @cmd nvarchar(max) 
select @cmd = a from (
    select 'EXEC sp_rename ''' + TABLE_NAME + ''', ''' + REPLACE(TABLE_NAME, @oq, N'') + ''' ' 
    from INFORMATION_SCHEMA.TABLES 
    for xml path('') 
) t(a) 
exec sp_executesql @cmd 

在您的例子nvarchar的一个简单的解决方案(5)导致截断,你可能需要nvarchar(7)或nvarchar(max)。