将1个表中的列重命名为另一个表中的行值

时间:2014-03-10 19:07:52

标签: sql sql-server-2008 tsql

好的,所以我总共有两张桌子:

  • Table 1有3列没有意义,因为它们只是varchar值:

    Q19243  Q19244  Q19245
    
  • Table 2有2列ColumnNameTextValue

ColumnName包含Table 1Q19243等)中3列名称的值,还有一个名为TextValue的对应列,其中包含友好的描述Q19243实际意味着什么。

因此Table 2中有3条记录,Table 1中每列有1条记录。

我想将Table 1中的这3列重命名为TextValueTable 2列中的任意列。我想动态地执行此操作,而不是使用简单的UPDATE语句来重命名列。对不起,我没有附加屏幕截图,但我没有看到附加按钮...

如果您运行此代码来创建2个表的示例,那么您可能应该更好地了解我所指的是什么。

create table #Table1 (Q19243 varchar(10),Q19244 varchar(10),Q19245 varchar(10))

Create table #Table2 (ColumnName varchar(10),TextValue varchar(50))

Insert into #Table2 select 'Q19243','Provider Name'
Insert into #Table2 select 'Q19244','The Provider You Usually See'
Insert into #Table2 select 'Q19245','How Long Going to Provider'

select * from #Table1
select * from #Table2

drop table #Table1
drop table #Table2

1 个答案:

答案 0 :(得分:2)

由于列重命名的目的仅用于输出目的,因此您可以使用针对Table2的查询来创建特定于Table1的动态SQL,该动态SQL将SELECT列上的列名称别名。

(以下示例使用原始问题中的示例代码,仅根据--==============行之间的内容而不同)

create table #Table1 (Q19243 varchar(10),Q19244 varchar(10),Q19245 varchar(10))

Create table #Table2 (ColumnName nvarchar(10),TextValue nvarchar(50))

Insert into #Table2 select 'Q19243','Provider Name'
Insert into #Table2 select 'Q19244','The Provider You Usually See'
Insert into #Table2 select 'Q19245','How Long Going to Provider'

select * from #Table1
select * from #Table2

--=========================================
DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = COALESCE(@SQL + N',', N'SELECT')
               + N' t1.'
               + t2.ColumnName
               + N' AS ['
               + t2.TextValue
               + N']'
FROM #Table2 t2

SET @SQL = @SQL + N' FROM #Table1 t1'

SELECT @SQL

EXEC(@SQL)
--=========================================

drop table #Table1
drop table #Table2

@SQL查询后SELECT @SQL=的值为:

  

SELECT t1.Q19243 AS [提供商名称],t1.Q19244 AS [提供商您   通常参见],t1.Q19245 AS [有多长时间去提供者] FROM#Table1   T1

注意:您需要字段名称别名(Table2.TextValue中的值)周围的方括号,因为字符串中有空格。