2011-12-09 87 views
5

我試着去執行一個SQL查詢,將與第一記錄表中的文本重命名錶的列的字段值。重命名SQL表的列與表

我的表看起來像這樣:

COL1 | COL2 | COL3 | COL4 | COL5 | COL6 

REASON |ITEMDATE|ITEMTIME|SITENAME| EVENT | RPM 
tstamp |12-11-07| 24:12 | Spain1 |Shutdwn | 1000 
tstamp |13-11-07| 02:22 | Spain1 |Startup | 1050 

而且我想重命名這樣的列:

REASON |ITEMDATE|ITEMTIME|SITENAME| EVENT | RPM 

tstamp |12-11-07| 24:12 | Spain1 |Shutdwn | 1000 
tstamp |13-11-07| 02:22 | Spain1 |Startup | 1050 

回答

4

此過程會做你的需要。您可以按如下方式運行它:

exec p_rename_columns N'<mytable>' 

請注意,該過程假定「第一個」行是磁盤上的物理第一行。由於這可能會根據表中聚集索引使用的字段而不同,因此不能100%保證。

的程序代碼:

create proc p_rename_columns (@table sysname) 
AS 

declare @name sysname, 
     @col sysname, 
     @sql nvarchar(max) 

declare cur cursor 
local read_only 
for select name 
     from sys.columns 
    where object_id = object_id(@table) 

open cur 
fetch next from cur into @name 

while @@fetch_status = 0 
    begin 

    select @sql = N'select top (1) @col = ' + quotename(@name) + N' from ' + quotename(@table) 
    exec sp_executesql @sql, N'@col sysname output', @col output 

    select @sql = N'exec sp_rename ''' + quotename(@table) + N'.' + quotename(@name) + N''', ''' + @col + N'''' 
    exec (@sql) 

    fetch next from cur into @name 
    end 
close cur 
deallocate cur 

select @sql = N'DELETE TOP (1) from ' + quotename(@table) 
exec (@sql) 
GO 
+0

完美,謝謝你爲我準備的東西! – neilrudds

+0

我添加了一些缺少quotename()調用。 –

2

有純SQL沒有簡單的方法,主要的選擇是建立一個動態SQL查詢或只返回一個結果集並讓表示層處理它。

但是,更大的問題是,爲什麼你在同一個表混合數據和元數據?如果一行具有列名稱,而其他一切都是數據,那麼只需創建一個具有正確列名稱的表格並將數據加載到該表格中即可。由於您似乎正在加載CSV文件,因此您可以通過use SSIS爲您完成大部分工作。

+0

的問題是,該表需要被動態地創建,有一個文件夾中多個CSV文件,並且每個文件具有不同的套頭(相同的和不相同)。最終目標是從一個文件夾中的所有這些csv文件中檢索數據,並將它們合併到一個表中。 – neilrudds

+0

SSIS並不總是可用的(例如SQL Server高速緩存) –

+0

如果不瞭解文件中的數據,試圖實現的內容等等,很難說最好的解決方案是什麼。如果事先知道標頭將如果源文件總是具有相同的結構,那麼可以預先創建一個包含所有列的表,並按列名或位置將每個文件加載到該表中。您可以使用您的首選語言使用SSIS或外部腳本。但是,如果事先都是動態的和未知的,你將不得不編寫自己的代碼來處理它。 – Pondlife

0

一旦我們有一個類似的問題。學習像SSIS這樣的其他工具有很高的學習曲線,並且在您的情況下並不經濟,因爲您只想在此使用它(一種專門的解決方案)。另一方面,試圖用純T-SQL編寫它需要訪問目錄視圖(元數據)並將它們與光標混合,或者對每個表使用交叉應用函數,這也很困難。

我提出了一個簡單的解決方案:

  1. 如果你只想做一次,你的表是不超過說10或20桌,簡單地用手在新數據庫中創建它們,然後編寫一個簡單的插入查詢來填充新表,並刪除不需要的行。
  2. 如果你有很多表,說超過20桌,或你想要做的這個過程多次(一個更大的解決方案的一部分),那麼只需你想在.NET做什麼。換句話說,讓你的數據庫的所有表的列表在你的代碼,然後爲每個表,拿到第一排,然後創建一個新表與相應的列標題,等這裏的要點是,你有多大在.NET環境中比在T-SQL中更強大。