在获取列名作为SQL 2008另一个表中的值时,我需要帮助。
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
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时对列名所做的更改都是如此。
答案 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