2012-02-13 1 views
0

У меня есть функция `DiffMinuti ', которую я использую внутри вычисленного столбца. Я хотел бы объявить его переменной, чтобы вызвать только один раз и оптимизировать код. Благодарим за помощь:SQL Server: как объявить функцию как переменную внутри вычисленного столбца

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

Спасибо! С наилучшими пожеланиями

ответ

1

Вы можете добавить новое поле для хранения результата 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 
+0

@domanager: Большое спасибо! Я не думал, что это было так сложно ... как вы считаете, самый эффективный способ вычисления расчетного поля «MinutiAllaScadenza»? Описанный вами, или тот, который в настоящее время используется мной, с двойным вызовом функции 'Diffminuti'? Большое спасибо, вы очень основательны и профессиональны! – Larry

+0

@Larry Это действительно зависит от того, как используется таблица, если есть много объемных вставок/обновлений, и очень немногие чтения из таблицы, которую вы используете, будут лучше, но если данные довольно статичны и запрашиваются против в значительной степени необходимость в вызове функции для каждой возвращаемой строки должна быть более эффективной. – domager

+0

@domager: теперь у вас есть обработка RBAR для оставшегося вычисленного столбца поверх второго, записывается в таблицу для DiffMinuti в худшем случае ... – gbn

2

Вы не можете сделать это непосредственно в выражении вычисляемого столбца: Вы бы обернуть выражение в другой функции

+0

THX @gbn ... Я вижу ответ на вышеприведенный domanager. Теперь я сомневаюсь в наиболее эффективном способе сделать это ... – Larry

+0

@Larry: Я бы сохранил вычисляемую колонку лично. И я бы просто держал его так, как он есть, а не с дополнительной функцией. Использование триггеров * и * вычисленного столбца в качестве ответов pre domager - это идиотизм IMO – gbn

+0

THX @gbn. По крайней мере, в моем случае, кажется, что слишком много для создания нового расчетного поля с помощью триггеров ... если нет реальных преимуществ от выступлений ... давайте посмотрим, что другие думают и решают ... еще раз спасибо! – Larry