2011-12-09 89 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中更强大。