【问题标题】:SQL get the names of the columns that are stored in a different tableSQL 获取存储在不同表中的列的名称
【发布时间】:2018-12-11 10:57:49
【问题描述】:

我有一个通用列名称为“PARAM1”、“PARAM2”、“PARAM3”的文章表...

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

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';

我想使用真实的实时数据,而不是硬编码来自 Article 表的不同查询的别名。另外,有没有办法不为每个 paramX 做 9 个不同的左连接?数据库一团糟,到处都在使用这种设计。谢谢

编辑:

这就是我现在的结果:

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';

【问题讨论】:

    标签: sql sql-server tsql alias


    【解决方案1】:

    以下代码/逻辑可用于完成您的任务:

    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;
    

    【讨论】:

    • 这是一个很好的开始,谢谢!我只需进行很少的修改就可以使其工作,但我仍在尝试将您的解决方案与其他通用列结合起来,这些列的名称来自另一个名为“NOMCARACS”的表。 SELECT C1.DESCCAR, -- 这是数据 NP1.NOMPAR -- 这是列名 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.NOMPARAS AS NP1 ON (NP1.TIPPAR = 'ART' AND NP1.NUMPAR ='1');
    • @Joe 您能否在其他问题中通过这些详细信息。评论似乎很乱。
    【解决方案2】:

    您可以使用一些动态 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
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2016-12-21
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多