使用表的字段值重命名SQL表的列
我正在尝试执行一个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
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编写它需要访问目录视图(元数据)并将它们与游标混合,或者对每个表使用交叉应用函数,这也是很困难的 我提出了一个更简单的解决方案:
此过程将满足您的需要。您可以按如下方式运行它:
exec p_rename_columns N'<mytable>'
问题是需要动态创建表,一个文件夹中有多个CSV文件,每个文件都有不同的标题集(相同和不相同)。最终目标是从一个文件夹中的所有csv文件中检索数据,并将其合并到一个表中。SSIS并非始终可用(例如SQL Server express)。如果不了解文件中的数据,很难说什么是最佳解决方案,如果您事先知道标题是什么,并且源文件总是具有相同的结构,那么您可以提前创建一个包含所有列的表,并按列名或位置将每个文件加载到其中。您可以使用SSI或首选语言的外部脚本。但是,如果事先一切都是动态的和未知的,您将不得不编写自己的代码来处理它。@FilipDeVos是的,这是一个很好的观点,也很好地提醒了为什么海报应该总是提到有关其SQL Server版本和环境的基本知识。太好了,非常感谢您,这正是我所需要的!!我添加了几个缺少的quotename()调用。