SQL-如何从另一个表中选择列别名?

SQL-如何从另一个表中选择列别名?,sql,tsql,Sql,Tsql,我在SQL中有一个包含数据的表和另一个包含该列别名的表。它用于翻译目的 我想知道如何在这些列上进行选择,但从另一个表中检索别名 这是包含真实列名的表: ID PageID ColName Order Type Width IsDeleted 1 7 CustType 2 NULL NULL 0 2 7 Description 3 NULL NULL 0 3 7 ApplyVAT 4

我在SQL中有一个包含数据的表和另一个包含该列别名的表。它用于翻译目的

我想知道如何在这些列上进行选择,但从另一个表中检索别名

这是包含真实列名的表:

ID      PageID  ColName         Order   Type    Width   IsDeleted
1   7   CustType    2   NULL    NULL    0
2   7   Description 3   NULL    NULL    0
3   7   ApplyVAT    4   NULL    NULL    0
4   7   ProduceInvoices 5   NULL    NULL    0
5   7   PurchaseSale    6   NULL    NULL    0
6   7   TermsDays   7   NULL    NULL    0
7   7   DateTimeLastUpdated 8   NULL    NULL    0
这是包含别名(文本)的表:


我相信您需要使用动态sql来完成此操作,例如:

DECLARE @Sql NVARCHAR(MAX);
SELECT TOP 1 @Sql = 'SELECT dt.ID as ' + at.IDAlias + ', dt.Town as ' + at.TownAlias 
                  + ' FROM DataTable dt'
FROM AliasTable at
WHERE at.LanguageID = 2;
EXEC(@Sql)
给出了数据表的示例

CREATE TABLE DataTable
(
   ID INT,
   Town NVARCHAR(50)
);
以及一个表,其中包含上述列的语言相关别名:

CREATE TABLE AliasTable
(
   LanguageId INT,
   IDAlias NVARCHAR(100),
   TownAlias NVARCHAR(100)
);


动态Sql的一个(许多)警告是,您需要确保别名数据针对Sql Injectin攻击进行验证。

对于表的布局很抱歉,我无法让它们显示在这里。您是否根据“包含真实列名的表”动态构建所有查询?另外,如何支持别名表中相同列的多个转换?(例如,通过
UserId
?)目前由于我所处的阶段,如果已为该页面和用户添加了内容,我将从翻译表(通过用户)中获取列表。我需要能够使用静态表中的列对数据库表进行选择,并显示用户已翻译的列。select语句此时是动态创建的。我尝试了此操作,但由于某些原因,我得到了无效的列名“CustType”。虽然列确实存在,但作为错误返回。我还对生成的sql列进行了选择,结果成功了。是否有任何原因可以解释为什么它不能与动态SQL一起工作?问题是,您正被预投影和后投影的列名所困扰。一旦您将CTE应用于项目名称,那么您需要在最终选择中使用后投影列名(由于映射,列名为
custypes
)啊,好了,我会记住未来的CTE。谢谢
CREATE TABLE AliasTable
(
   LanguageId INT,
   IDAlias NVARCHAR(100),
   TownAlias NVARCHAR(100)
);