sql - 使用映射表动态更改列名

标签 sql sql-server tsql dynamic mapping

处理这个要求对我来说很有趣但很复杂,我有以下信息:

CREATE TABLE #mainTable (id INT, ename VARCHAR(20), eaddress VARCHAR(20))
INSERT INTO #mainTable VALUES
(1, 'A', 'B'),
(2, 'B', 'C'),
(3, 'C', 'D')

--OrgTable
id  ename   eaddress
1   A       B
2   B       C
3   C       D

CREATE TABLE #mappingTable (ExportField VARCHAR(20), SelectField VARCHAR(20))
INSERT INTO #mappingTable VALUES
(1, 'ID'),
(2, 'EName'),
(3, 'EAddress')

--#mappingTable
ExportField     SelectField
1               ID
2               EName
3               EAddress

CREATE TABLE #queryBlock(id INT, Equery VARCHAR(MAX))
INSERT INTO #queryBlock VALUES 
(1, 'SELECT id AS [ID], ename AS [EName], eaddress AS [EAddress] FROM #mainTable')

我只需要执行此查询,该查询保存在上面的 Equery 列中,我无法直接在其中进行更改,但输出将如下所示,其中包含映射表中的新列名或标题。

--Desired Output
1   2       3
-------------
1   A       B
2   B       C
3   C       D

我有几十个类似的映射任务,但一直在思考从哪里开始。请帮助我,真的,我会非常感谢你。

最佳答案

使用下面的查询。

DECLARE@colList varchar(500)

SELECT @colList=coalesce(@colList+ ',', '') +  convert(varchar(12),SelectField)+' as '+QUOTENAME(cast(ExportField as varchar(10))) 
FROM #mappingTable B

INSERT INTO #queryBlock VALUES 
(1, 'SELECT '+ @colList+'FROM #mainTable')

如果您想动态执行它,请尝试编写如下脚本。

DECLARE @sql NVARCHAR(MAX)='SELECT '+ @colList+'FROM #mainTable'
EXEC(@sql)

如果您想从#queryblock tabble 运行它,请使用以下脚本。

DECLARE @sql NVARCHAR(MAX)
SELECT @sql=Equery FROM #queryBlock WHERE ID=1
EXEC(@sql)

关于sql - 使用映射表动态更改列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39653793/

相关文章:

mysql - 返回在两列中多次出现的 Year-Value

php - MySQL 按位非操作没有返回所需的值

mysql - 选择最大列的值无法提供所需的结果

sql - 在 FROM 之前在 SQL Server 中创建别名?

sql-server - 使用params在另一个数据库中执行存储过程

sql - @@IDENTITY、SCOPE_IDENTITY()、OUTPUT 和其他检索最后身份的方法

tsql - 使用最新日期在 t-sql 中分组

c# - 在 C# 中使用选择计数 (*)

sql-server - SSDT 不考虑触发器启用/禁用属性

sql - 将 NTEXT 列与常量值进行比较的正确方法是什么?