【问题标题】:SQL Server: How to declare function as variable inside computed columnSQL Server:如何在计算列中将函数声明为变量
【发布时间】:2012-02-13 11:45:54
【问题描述】:

我有一个函数“DiffMinuti”,我在计算列中使用它。我想将它声明为变量,只调用一次并优化代码。感谢您的帮助:

ALTER TABLE Ticket ADD MinutiAllaScadenza AS ( " +
CASE
WHEN StatoTicketID > 3 AND dbo.DiffMinuti(DataArrivo, DataObiettivo) <0 THEN 10000000 
ELSE dbo.DiffMinuti(DataArrivo, DataObiettivo) 
END)

谢谢! 最好的问候

【问题讨论】:

    标签: sql-server function calculated-columns


    【解决方案1】:

    您不能直接在计算列表达式中执行此操作:您必须将表达式包装在另一个函数中

    【讨论】:

    • THX @gbn...我看到上面的domanager的回答。现在我怀疑最有效的方法......
    • @Larry:我会亲自保留计算列。而且我也会保持原样,而不是为额外的功能而烦恼。使用触发器计算列作为前domager的答案是白痴IMO
    • THX @gbn。至少在我的情况下,用触发器创建一个新的计算字段似乎太多了......除非表演有实际的好处......让我们看看其他人的想法并决定......再次感谢!
    【解决方案2】:

    您可以添加一个新字段来存储 DiffMinuti 结果并使用 INSERT 和 UPDATE 触发器来保持值最新,然后只需在 MinutiAllaScadenza 计算字段中引用新字段(而不是每次都调用该函数)。

    类似这样的:

    ALTER TABLE Ticket ADD DiffMinuti INT NULL
    GO
    CREATE TRIGGER trg_Ticket_DiffMinuti ON Ticket
    AFTER INSERT, UPDATE
    AS
    BEGIN
    
        SET NOCOUNT ON;
    
        IF UPDATE(DataArrivo) OR UPDATE(DataObiettivo)
        BEGIN
    
            UPDATE
                b
            SET
                DiffMinuti = dbo.DiffMinuti(DataArrivo, DataObiettivo)
            FROM
                INSERTED a INNER JOIN
                Ticket b ON a.TicketID = b.TicketID;
    
        END;
    
    END;
    GO
    ALTER TABLE Ticket ADD MinutiAllaScadenza AS CASE WHEN StatoTicketID > 3 AND DiffMinuti <0 THEN 10000000  ELSE DiffMinuti END
    GO
    

    【讨论】:

    • @domanager:非常感谢!没想到这么复杂...您认为计算MinutiAllaScadenza 计算字段的最有效方法是什么?你描述的那个,或者我目前使用的那个,双重调用函数Diffminuti?非常感谢你,你很周到也很专业!
    • @Larry 这真的取决于表的使用方式,如果有很多批量插入/更新并且从表中读取的次数很少,那么你的方法会更好,但如果数据是相当静态的,并且被大量查询,不必为返回的每一行调用函数应该更有效。
    • @domager:在最坏的情况下,您现在可以对 DiffMnuti 的第二次写入表顶部的剩余计算列进行 RBAR 处理...
    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2011-05-12
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多