2017-11-18 73 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)。