选择“列”作为SQL SERVER中另一个表中值的列名

时间:2018-11-15 16:55:42

标签: sql-server tsql sql-server-2008

在获取列名作为SQL 2008另一个表中的值时,我需要帮助。

例如

表A

Type     Col1      Col2      Col3     Col4      Col5

101      1         2         3        2         5
102      4         2         3        2         0
103      2         1         0        0         5
103      7         2         0        0         5
105      8         3         0        0         0

表B

ColID        ColName

Col1         Math
Col2         English
Col3         French
Col4         Fine Arts
Col5         Biology

因此,基本上,表B包含从表A中选择时要使用的列名 这样的话,如果我想做一个示例代码

Select Col1,Col2,Col3 from TableA

应该看起来像

Select Col1 as Math, Col2 as English, Col3 as French from Table A........

我已经尽力了,但是没有得到任何代码给我我想要的东西。...

需要帮助。

注意* 之所以设计这样的表,是因为列名可以由用户非常频繁地更改,而不是每次都必须更改代码,无论我导出到excel时对列名所做的更改都是如此。

2 个答案:

答案 0 :(得分:0)

要在当前设计中完成此操作,您将必须使用动态SQL。在这里,我不会讨论动态SQL的优缺点。有关更多信息,请访问here。如果您不熟悉动态SQL,强烈建议您仔细阅读。

CREATE TABLE #TableA (Type int, Col1 int, Col2 int, Col3 int, Col4 int, Col5 int);

CREATE TABLE #TableB (ColId varchar(50), ColName varchar(50));

INSERT INTO #TableA VALUES
(101, 1, 2, 3, 2, 5),
(102, 4, 2, 3, 2, 0),
(103, 2, 1, 0, 0, 5),
(103, 7, 2, 0, 0, 5),
(105, 8, 3, 0, 0, 0);

INSERT INTO #TableB VALUES
('Col1', 'Math'),
('Col2', 'English'),
('Col3', 'French'),
('Col4', 'Fine Arts'),
('Col5', 'Biology');

DECLARE @Sql nvarchar(MAX);

/*   Build SELECT   */
SET @Sql = 'SELECT ';

SELECT @Sql = @Sql + ColId + ' AS ''' + ColName + ''', ' FROM #TableB;

/*   Remove trailing comma   */
SET @Sql = (SELECT LEFT(@Sql, LEN(@Sql)-1));

/*   Add FROM   */
SET @Sql = @Sql + ' FROM #TableA';

/*   Output query   */
SELECT @Sql;

/*   Execute query   */
EXEC sp_executesql @Sql;

DROP TABLE #TableA;
DROP TABLE #TableB;

答案 1 :(得分:0)

您可以执行动态查询,其中将别名替换为配置的列名。您可以使用以下代码来做到这一点:

use [tempdb]
go

drop table if exists TableA
drop table if exists TableB

create table TableA([Type] int, [Col1] int, [Col2] int, [Col3] int, [Col4] int, [Col5] int)

insert into TableA values
(101,      1,         2,         3,        2,         5),
(102,      4,         2,         3,        2,         0),
(103,      2,         1,         0,        0,         5),
(103,      7,         2,         0,        0,         5),
(105,      8,         3,         0,        0,         0)

create table TableB(ColID sysname, ColName sysname)

insert into TableB values
('Col1',         'Math'),
('Col2',         'English'),
('Col3',         'French'),
('Col4',         'Fine Arts'),
('Col5',         'Biology')


declare @sql nvarchar(max) = N'select [Type], [Col1] as [{Col1}], [Col2] as [{Col2}], [Col3] as [{Col3}], [Col4] as [{Col4}], [Col5] as [{Col5}] from TableA'

-- Execute unmodified query
exec sp_executesql @sql

-- Replace aliases with column names
select @sql = REPLACE(@sql, CONCAT(N'{', ColID, N'}'), ColName)
from TableB

-- Execute query with replaced aliases
exec sp_executesql @sql

-- Cleanup
drop table if exists TableA
drop table if exists TableB