我试图执行一个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
答案 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中编写它需要访问目录视图(元数据)并将它们与游标混合,或者使用每个表的交叉应用功能,这也很困难。
我提出了一个更简单的解决方案: