Sql server SQL Server:如何在计算列中将函数声明为变量

Sql server SQL Server:如何在计算列中将函数声明为变量,sql-server,function,calculated-columns,Sql Server,Function,Calculated Columns,我有一个函数'DiffMinuti',我在计算列中使用它。我想将它声明为变量,只调用一次并优化代码。感谢您的帮助: ALTER TABLE Ticket ADD MinutiAllaScadenza AS ( " + CASE WHEN StatoTicketID > 3 AND dbo.DiffMinuti(DataArrivo, DataObiettivo) <0 THEN 10000000 ELSE dbo.DiffMinuti(DataArrivo, DataObietti

我有一个函数'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)
ALTER TABLE Ticket将细节点添加为(“+
案例

当StatoTicketID>3且dbo.DiffMinuti(DataArrivo,DataObiettivo)时,您可以添加一个新字段来存储DiffMinuti结果,并有一个INSERT和UPDATE触发器来保持值最新,然后只需在minitiallascadenza计算字段中引用新字段(而不是每次调用函数)

大概是这样的:

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
ALTER TABLE票证添加DiffMinuti INT NULL
去
在记录单上创建触发器训练记录单
插入后,更新
作为
开始
不计数;
如果更新(DataArrivo)或更新(DataObiettivo)
开始
更新
B
设置
DiffMinuti=dbo.DiffMinuti(DataArrivo,DataObiettivo)
从…起
插入内部联接
a.TicketID=b.TicketID上的票证b;
结束;
结束;
去

ALTER TABLE Ticket ADD MINITIALLASCADENZA当StatoTicketID>3且DiffMinuti时,您可以添加一个新字段来存储DiffMinuti结果,并使用INSERT和UPDATE触发器来保持值最新,然后只需在MINITIALLASCADENZA计算字段中引用新字段(而不是每次调用函数)

大概是这样的:

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
ALTER TABLE票证添加DiffMinuti INT NULL
去
在记录单上创建触发器训练记录单
插入后,更新
作为
开始
不计数;
如果更新(DataArrivo)或更新(DataObiettivo)
开始
更新
B
设置
DiffMinuti=dbo.DiffMinuti(DataArrivo,DataObiettivo)
从…起
插入内部联接
a.TicketID=b.TicketID上的票证b;
结束;
结束;
去

ALTER TABLE Ticket ADD MINITIALLASCADENZA当StatoTicketID>3和DiffMinuti您不能直接在计算列表达式中执行此操作:您必须将表达式包装到另一个函数中

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

@domanger:谢谢非常感谢!我没想到它这么复杂…你认为计算
细节斯卡登扎
计算字段最有效的方法是什么?您描述的方法,还是我目前使用的方法,双重调用函数
Diffminuti
?非常感谢,您非常全面和专业@Larry这实际上取决于表的使用方式,如果有大量的大容量插入/更新,并且从表中读取的数据很少,那么您使用的方法会更好,但是如果数据是相当静态的,并且被大量查询,那么不必为返回的每一行调用函数应该会更有效。@domager:您现在有了RBAR处理对于最坏情况下,第二次写入DiffMinuti表中的剩余计算列…@Domainger:非常感谢!我不认为它这么复杂…您认为计算
Minitiallascadenza
computed字段最有效的方法是什么?您描述的方法,还是我目前使用的方法对函数的双重调用
Diffminuti
?非常感谢,你是非常彻底和专业的!@Larry这真的取决于表的使用方式,如果有大量的批量插入/更新,并且从表中读取的数据很少,你的方法会更好,但是如果数据是相当静态的,并且被大量查询不必为返回的每一行调用函数应该更有效。@domager:现在,在最坏的情况下,您可以对DiffMinuti的第2次写入表中的剩余计算列进行RBAR处理…THX@gbn…我从上面的domager的回答中看到了。现在,我怀疑最有效的方法是什么…@Larry:我会保留我个人的计算列。我只是保持原样,不需要额外的函数。使用触发器和计算列作为pre-domager的答案是愚蠢的IMOTHX@gbn。至少在我的情况下,用触发器创建一个新的计算字段似乎太多了…除非性能有实际好处…le让我们看看其他人的想法和决定…再次感谢!THX@gbn…我从上面Domainger的答案中看到了。现在我怀疑最有效的方法是什么…@Larry:我个人会保留计算列。我也会保留它的方式,而不必担心额外的函数。使用触发器和计算列作为域管理员的答案是愚蠢的y IMOTHX@gbn。至少在我的例子中,用触发器创建一个新的计算字段似乎太多了……除非性能有实际好处……让我们看看其他人怎么想和决定……再次感谢!