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

使用表的字段值重命名SQL表的列,sql,sql-server,tsql,csv,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

我正在尝试执行一个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 
我想重命名这些列,如下所示:

 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 

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


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

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

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

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

  • 此过程将满足您的需要。您可以按如下方式运行它:

        exec p_rename_columns N'<mytable>'
    

    问题是需要动态创建表,一个文件夹中有多个CSV文件,每个文件都有不同的标题集(相同和不相同)。最终目标是从一个文件夹中的所有csv文件中检索数据,并将其合并到一个表中。SSIS并非始终可用(例如SQL Server express)。如果不了解文件中的数据,很难说什么是最佳解决方案,如果您事先知道标题是什么,并且源文件总是具有相同的结构,那么您可以提前创建一个包含所有列的表,并按列名或位置将每个文件加载到其中。您可以使用SSI或首选语言的外部脚本。但是,如果事先一切都是动态的和未知的,您将不得不编写自己的代码来处理它。@FilipDeVos是的,这是一个很好的观点,也很好地提醒了为什么海报应该总是提到有关其SQL Server版本和环境的基本知识。太好了,非常感谢您,这正是我所需要的!!我添加了几个缺少的quotename()调用。