Будет ли создание переменной в случае необходимости в хранимой процедуре или функции или триггере, помогает в оптимизации производительности? Какой из них лучше ниже или оба имеют одинаковые характеристики?Помогает ли создание переменной при необходимости?
Вариант 1:
CREATE TRIGGER [dbo].[UpdateAmount] ON [RequestDB].[dbo].[Invoice]
AFTER UPDATE
AS
BEGIN
IF UPDATE(Service_Amount)
BEGIN
DECLARE @NewService_Amount float,@OldService_Amount float //Var Created When needed
SELECT @NewService_Amount = I.Service_Amount FROM INSERTED I
SELECT @OldService_Amount = D.Service_Amount FROM DELETED D
IF (@NewService_Amount <> @OldService_Amount)
BEGIN
SELECT @InvId = I.Id FROM INSERTED I
DECLARE @DiffService_Amount float //Var Created When needed
SET @DiffService_Amount = @NewService_Amount - @OldService_Amount
UPDATE [RequestDB].[dbo].[Request] SET Actual_Amount = @DiffService_Amount WHERE Invoice_Id = @InvId
END
END
END
Вариант 2:
CREATE TRIGGER [dbo].[UpdateAmount] ON [RequestDB].[dbo].[Invoice]
AFTER UPDATE
AS
BEGIN
DECLARE @NewService_Amount float,@OldService_Amount [email protected]_Amount float //All Var Created at once on top of code
IF UPDATE(Service_Amount)
BEGIN
SELECT @NewService_Amount = I.Service_Amount FROM INSERTED I /*For New UPDATE Value: INSERTED. For Old BEFORE UPDATE Valie: DELETED*/
SELECT @OldService_Amount = D.Service_Amount FROM DELETED D
IF (@NewService_Amount <> @OldService_Amount)
BEGIN
SELECT @InvId = I.Id FROM INSERTED I
SET @DiffService_Amount = @NewService_Amount - @OldService_Amount
UPDATE [RequestDB].[dbo].[Request] SET Actual_Amount = @DiffService_Amount WHERE Invoice_Id = @InvId
END
END
END
Вы могли бы хотеть прочитать об этом первым: http://www.jimmcleod.net/blog/index.php/2008/06/05/triggers -set-based-not-row-based/ – granadaCoder
Согласовано с granadaCoder - поскольку оба неверны, если предположить, что 'вставленный' и' deleted' содержат одну строку, это не та область, в которой я бы сосредоточился. После того, как вы переключитесь на выполнение набора на основе 'UPDATE', вероятно, не будет никаких локальных переменных вообще. –