【问题标题】:Dynamic SQL in column name to get max of that column列名中的动态 SQL 以获取该列的最大值
【发布时间】:2017-10-10 10:10:23
【问题描述】:

我有以下查询,我想获取在动态 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

【问题讨论】:

    标签: sql sql-server tsql dynamic-sql


    【解决方案1】:

    你需要像下面这样的动态 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

    根据您的评论

    现在,我遇到了更大的问题,我无法将日期时间传递到我的动态 SQL 中。我也尝试了 Cast / Convert,用三引号但仍然有问题

    修改后的解决方案如下

    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

    【讨论】:

    • 非常感谢@DhruvJoshi
    • @Farhad 如果它对您有用,请接受我的回复作为正确答案 - 以便其他用户可以受益:知道答案有效并将问题标记为已回答
    • 现在,我遇到了更大的问题,我无法将日期时间传递给我的动态 SQL。我也尝试使用三引号中的 Cast / Convert,但仍然有问题。
    【解决方案2】:

    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)
    

    【讨论】:

    • 你的 ans 和 Dhruv joshi ans 有什么区别
    • 这行不通 - 您需要将 exec @sql 放在括号内
    • 我想解释为什么问题中的示例不起作用,日期左侧还有很多逗号破坏了字符串 - 不幸的是我无法编辑其他答案或问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多