SQL 获取存储在不同 table 中的列的名称

SQL get the names of the columns that are stored in a different table

我有一篇文章 table,其中的通用列名称为 "PARAM1"、"PARAM2"、"PARAM3"...

这些列的真实名称存储在不同的table。

SELECT
A.PARAM1, -- This is the data
N1.NOMPAR, -- This is the column name
A.PARAM2 AS N2.NOMPAR -- This does not work, but the desired output
FROM dbo.ARTICULO AS A
LEFT JOIN dbo.NOMPARAMS AS N1 ON N1.NUMPAR = 1 AND N1.TIPPAR='ART'
LEFT JOIN dbo.NOMPARAMS AS N2 ON N2.NUMPAR = 2 AND N2.TIPPAR='ART';

我不想使用文章 table 中针对不同查询的硬编码别名,而是使用真实的实时数据。另外,有没有办法不对每个paramX做9次不同的left join?数据库一团糟,到处都在使用这种设计。谢谢

编辑:

这就是我现在的结果:

DECLARE @DynamicTSQLStatement NVARCHAR(MAX);
SET @DynamicTSQLStatement
= N'SELECT CODART, ' + STUFF(
                                (
                                    SELECT ',[PARAM' + RIGHT([NUMPAR] + 10, 1) + '] AS [' + [NOMPAR] + ']'
                                    FROM dbo.NOMPARAMS
                                    WHERE TIPPAR = 'ART'
                                          AND NOMPAR <> ''
                                    ORDER BY [NUMPAR]
                                    FOR XML PATH(''), TYPE
                                ).value('.', 'VARCHAR(MAX)'),
                                1,
                                1,
                                ''
                            ) + N'FROM dbo.ARTICULO';
EXEC sp_executesql @DynamicTSQLStatement;

仍在寻找如何向查询添加联接

SELECT C1.DESCCAR, -- This is the data
NP1.NOMPAR, -- This is the column name
C2.DESCCAR AS NP2.NOMPAR, -- This does not work, but the desired output
A.PARAM1, -- This is the data
N1.NOMPAR, -- This is the column name
A.PARAM2 AS N2.NOMPAR -- This does not work, but the desired output
FROM dbo.ARTICULO A
 LEFT JOIN dbo.CARACTERISTICAS AS C1 ON(C1.TIPCAR='A' AND C1.NUMCAR='1' AND C1.CODCAR=A.CAR1)
 LEFT JOIN dbo.CARACTERISTICAS AS C2 ON(C2.TIPCAR='A' AND C2.NUMCAR='2' AND C2.CODCAR=A.CAR2)
 LEFT JOIN dbo.NOMPARAMS AS NP1 ON(NP1.TIPPAR='ART' AND NP1.NUMPAR='1')
 LEFT JOIN dbo.NOMPARAMS AS N1 ON N1.NUMPAR=1 AND N1.TIPPAR='ART'
 LEFT JOIN dbo.NOMPARAMS AS N2 ON N2.NUMPAR=2 AND N2.TIPPAR='ART';

以下code/logic可以用来完成你的任务:

DROP TABLE IF EXISTS #DataSource;

CREATE TABLE #DataSource
(
    [Param01] INT
   ,[Param02] INT
   ,[Param03] INT
);

DECLARE @DataHeadings TABLE
(
    [ColumnID] INT
   ,[ColumnName] SYSNAME
);

INSERT INTO #DataSource ([Param01], [Param02], [Param03])
VALUES (1, 1, 1)
      ,(2, 2, 2)
      ,(3, 3, 3);

INSERT INTO @DataHeadings ([ColumnID], [ColumnName])
VALUES (1, 'name')
      ,(2, 'age')
      ,(3, 'login');

DECLARE @DynamicTSQLStatement NVARCHAR(MAX);


SET @DynamicTSQLStatement = N'SELECT ' + STUFF
                            (
                                (
                                    SELECT ',[Param' + RIGHT([ColumnID] + 100, 2) + '] AS [' + [ColumnName] + ']'
                                    FROM @DataHeadings
                                    ORDER BY [ColumnID]
                                    FOR XML PATH(''), TYPE
                                ).value('.', 'VARCHAR(MAX)')
                                ,1
                                ,1
                                ,''
                            )
                            + 'FROM #DataSource';

EXEC sp_executesql @DynamicTSQLStatement;

您可以使用一些动态的 SQL 来做到这一点,如下所示:

DECLARE @NOMPAR1 sysname, @NOMPAR2 sysname
SELECT
    @NOMPAR1 = CASE WHEN NUMPAR = 1 THEN NOMPAR ELSE @NOMPAR1 END,
    @NOMPAR2 = CASE WHEN NUMPAR = 2 THEN NOMPAR ELSE @NOMPAR2 END
FROM
    NOMPARAMS
WHERE TIPPAR = 'ART'


DECLARE @sql nvarchar(4000)
SET @sql = N'
SELECT 
    A.PARAM1 AS ' + QUOTENAME(@NOMPAR1) + N',
    A.PARAM2 AS ' + QUOTENAME(@NOMPAR2) + N'
FROM 
    ARTICULO A'
PRINT @sql

EXEC sp_executesql @sql

但它是如此丑陋,而且对开发人员不友好,我宁愿硬编码列别名。

更好的选择是依靠客户端应用程序来处理列名。