2017-05-23 128 views
0

我需要重命名數據庫中所有表中的列。 這樣一列「OldColumn」在所有表重命名爲「NewColumn」重命名所有表中的列 - SQL

我能得到有使用此查詢此列的表的列表:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME= <Column Name> 

但我怎樣才能將其重命名在所有表格中儘可能簡單並且不必編寫光標?

+1

爲什麼你不想使用遊標? – alroc

+2

我真的不認爲**這是可能**沒有**遊標,但我可能是錯的。無論如何,這是我找到合適的光標的次數*次數之一。 – scsimon

+2

我同意,光標看起來很好,在這裏重命名幾列。 –

回答

2

當然,你不需要爲這個光標。您可以使用sys.columns和sys.objects生成動態sql。然後簡單地執行它。一旦你滿意,動態sql就是你想要取消最後一行的註釋。

---- BE WARNED !!!! ---- 如果更改列名稱,您的視圖,存儲過程,函數等都將被打破。

declare @CurrentColumnName sysname = 'asdf' 
    , @NewColumnName sysname = 'qwer' 
    , @SQL nvarchar(MAX) = '' 

select @SQL = @SQL + 'EXEC sp_rename ''' + o.name + '.' + c.name + ''', ''' + @NewColumnName + ''', ''COLUMN'';' 
from sys.columns c 
join sys.objects o on o.object_id = c.object_id 
where c.name = @CurrentColumnName 

select @SQL 

--exec sp_executesql @sql 
+0

我沒有考慮動態地做它... SMRT – scsimon

+0

太棒了!這工程..! +1,爲了簡單和清晰 – Akhila

1

請試試這個,這將生成腳本

select 'EXEC sp_rename ' + tableName + ''' OldColumn''' + ' ' + '''NewColumn''' 
from 
(select distinct OBJECT_NAME(OBJECT_ID) tableName from sys.columns where name like '%DUNS%')a 
+3

這對於重命名所有表中的列沒有任何作用。 – xQbert

+1

沒有完全讀到這個問題:-) –

0

您可以生成這樣的腳本,然後一氣呵成執行:

declare @oldColumn nvarchar(max) = 'department_id' 
declare @newColumn varchar(max) = 'dept_id' 
declare @query nvarchar(max) 

select 'exec sp_rename '+ char(39) + table_name + '.' + @oldColumn + char(39) 
    +', '+ char(39) + @newColumn + char(39) + ','+ char(39) + 'COLUMN' +Char(39) + ' GO ' from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME = 'department_id' 

供您參考生成的腳本:

exec sp_rename 'table5.department_id', 'dept_id','COLUMN' 
exec sp_rename 'table6.department_id', 'dept_id','COLUMN' 
exec sp_rename 'table1.department_id', 'dept_id','COLUMN' 
0

下面的動態通吃的表名在包含給定列名稱的數據庫中,在本例中爲'COL_A',並將這些名稱插入到表中,在本例中爲'DBO.QUEUE'。然後該表充當下面的光標的隊列。動態SQL用於遍歷隊列,並調用sp_RENAME重命名每個適用表中的列。

--The below two tables will be found and update 
CREATE TABLE DBO.TEST1 (COL_A INT) 
CREATE TABLE DBO.TEST2 (COL_A INT) 

--The below will NOT update 
CREATE TABLE DBO.TEST3 (COL_B INT) 

--Create a table to act as a queue 
CREATE TABLE DBO.QUEUE (TABLENAME VARCHAR(255)) 

--Insert into the queue based upon your criteria 
INSERT INTO QUEUE 
SELECT DISTINCT(TABLE_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME= 'COL_A' 

--Run the cursor to update 
DECLARE 

@TABLENAME VARCHAR(255) 

DECLARE Cursor_Name CURSOR LOCAL FAST_FORWARD FOR 
      SELECT 
         TABLENAME 
      FROM 
         DBO.QUEUE AS LIST; 


OPEN Cursor_Name 
FETCH NEXT FROM Cursor_Name INTO @TABLENAME 

WHILE @@FETCH_STATUS = 0 
BEGIN 

--Dynamic SQL is used to execute the sp_Rename procedure with the applicable table name. 
Declare @colupdate_ varchar(MAX) 
set @colupdate_= 
'EXEC sp_RENAME ' + '"' + @TABLENAME + '.' + 'COL_A' + '"' + ',' + '"' + 'NEW_COLUMN_NAME' + '"' + ',' + '"' +'COLUMN' + '"' 
exec(@colupdate_) 

FETCH NEXT FROM Cursor_Name INTO @TABLENAME 
END 

CLOSE Cursor_Name 
DEALLOCATE Cursor_Name