我需要重命名數據庫中所有表中的列。 這樣一列「OldColumn」在所有表重命名爲「NewColumn」重命名所有表中的列 - SQL
我能得到有使用此查詢此列的表的列表:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME= <Column Name>
但我怎樣才能將其重命名在所有表格中儘可能簡單並且不必編寫光標?
我需要重命名數據庫中所有表中的列。 這樣一列「OldColumn」在所有表重命名爲「NewColumn」重命名所有表中的列 - SQL
我能得到有使用此查詢此列的表的列表:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME= <Column Name>
但我怎樣才能將其重命名在所有表格中儘可能簡單並且不必編寫光標?
當然,你不需要爲這個光標。您可以使用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
請試試這個,這將生成腳本
select 'EXEC sp_rename ' + tableName + ''' OldColumn''' + ' ' + '''NewColumn'''
from
(select distinct OBJECT_NAME(OBJECT_ID) tableName from sys.columns where name like '%DUNS%')a
這對於重命名所有表中的列沒有任何作用。 – xQbert
沒有完全讀到這個問題:-) –
您可以生成這樣的腳本,然後一氣呵成執行:
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'
下面的動態通吃的表名在包含給定列名稱的數據庫中,在本例中爲'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
爲什麼你不想使用遊標? – alroc
我真的不認爲**這是可能**沒有**遊標,但我可能是錯的。無論如何,這是我找到合適的光標的次數*次數之一。 – scsimon
我同意,光標看起來很好,在這裏重命名幾列。 –