使用表的字段值重命名SQL表的列

时间:2011-12-09 09:58:06

标签: sql sql-server tsql csv

我试图执行一个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 

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

纯SQL中没有简单的方法,主要选项是构建动态SQL查询或只返回一个结果集,让你的表示层处理它。

但是,更大的问题是为什么要在同一个表中混合数据和元数据?如果一行具有列名,而其他所有内容都是数据,那么只需创建一个包含正确列名的表并将数据加载到其中。由于您似乎正在加载CSV文件,因此您可以use SSIS为您完成大部分工作。

答案 2 :(得分:0)

一旦我们遇到类似的问题。学习像SSIS这样的其他工具有很高的学习曲线,在你的情况下也不经济,因为你只想在这里使用它(一个临时解决方案)。另一方面,尝试在纯T-SQL中编写它需要访问目录视图(元数据)并将它们与游标混合,或者使用每个表的交叉应用功能,这也很困难。

我提出了一个更简单的解决方案:

  1. 如果您只想做一次,并且您的表不超过10或20个表,只需在新数据库中手动创建它们,然后编写一个简单的插入查询来填充新表,并删除不需要的表行。
  2. 如果你有很多表,比如20多个表,或者你想多次执行这个过程(一个更大的解决方案的一部分),那么只需在.NET中做你想做的事情。换句话说,在代码中获取数据库的所有表的列表,然后为每个表获取第一行,然后创建一个具有相应列标题的新表等。这里的要点是,你有很多在.NET的环境中,而不是在T-SQL中。