代码之家  ›  专栏  ›  技术社区  ›  Freddy

在列名中使用动态SQL以获取该列的最大值

  •  0
  • Freddy  · 技术社区  · 8 年前

    我有下面的查询,我想获得在动态SQL中创建的列的最大值。但结果并不完全相同。 你能帮我一下吗?

    DECLARE @RT VARCHAR(6)
    SET @RT     = 'RT1401'
    
    SELECT      max(KWh_RT1401A_BLU)    AS Test1,
                max('KWh_'+@RT+'A_BLU') AS Test2
    
                FROM [PlantData].[dbo].[POD14_Kwh]
                where timestamp >='2017-08-24'
    

    结果是:

    Test1         Test2
    ------------- ---------------
    730.3399      KWh_RT1401A_BLU
    
    2 回复  |  直到 8 年前
        1
  •  4
  •   DhruvJoshi    8 年前

    对于下面这样的情况,您需要动态sql

    DECLARE @RT VARCHAR(6)
    SET @RT     = 'RT1401'
    DECLARE @SQL VARCHAR(MAX)
    
    SET @SQL=' SELECT max(KWh_RT1401A_BLU) AS Test1, '+
             ' max(KWh_'+@RT+'A_BLU) AS Test2 '+
             ' FROM [PlantData].[dbo].[POD14_Kwh] '+
             ' where timestamp >=''2017-08-24'''
    EXEC( @SQL)
    

    See working demo

    根据你的评论

    现在,我有一个更大的问题,我不能将datetime传递到我的动态SQL中。我也尝试用三重引号转换/转换,但仍然存在问题

    修改后的解决方案如下

    CREATE TABLE [POD14_Kwh]( [KWh_RT1401A_BLU] int, timestamp datetime)
    INSERT INTO POD14_Kwh VALUES
    (730.3399,'2017-08-24 00:00:00'),(1.00,'2017-08-24 00:00:00');
    
    DECLARE @RT VARCHAR(6)
    SET @RT     = 'RT1401'
    DECLARE @SQL VARCHAR(MAX)
    DECLARE @dt DATETIME
    SET @dt = '2017-08-24 00:00:00'
    
    
    
    SET @SQL=' SELECT max(KWh_RT1401A_BLU) AS Test1, '+
             ' max(KWh_'+@RT+'A_BLU) AS Test2 '+
             ' FROM [POD14_Kwh] '+
             ' where timestamp >='''+CAST(@dt as varchar(max))+''''
    EXEC( @SQL)
    

    demo link

        2
  •  2
  •   Stephen Whitfield    8 年前

    Dhruv Joshi 如果正确,则需要使用动态SQL。在您的示例中,您创建了一个字符串,而不是引用了一个列名。确保执行动态SQL字符串以接收所需的输出。

    DECLARE @RT VARCHAR(6)
            ,@SQL VARCHAR(MAX)
    SET @RT     = 'RT1401'
    
    
    SET @SQL=' SELECT max(KWh_RT1401A_BLU) AS Test1, '+
             ' max(KWh_'+@RT+'A_BLU) AS Test2 '+
             ' FROM [PlantData].[dbo].[POD14_Kwh] '+
             ' where timestamp >= ''2017-08-24'''
    
    EXEC (@SQL)