0

У меня есть длинный sql-запрос, который будет выполнен с 4 различными параметрами, поэтому я должен повторить этот запрос 4 раза. Я пытаюсь оптимизировать его, но он не работает. Вот мой запрос:Оптимизируйте SQL-запрос, чтобы избежать повторения

IF EXISTS (SELECT TOP 1 Id_Unique FROM Table1 WHERE Parameter= @Parameter1) 
BEGIN 
    UPDATE Table1 
    SET Value = 'True' 
    WHERE Parameter = @Parameter1 
END 
ELSE 
BEGIN 
    INSERT INTO Table1 (Parameter, Value) 
    VALUES(@Parameter1, 'True') 
END 

Единственное, что изменится с каждой итерации имя параметра: @Parameter1/@Parameter2/@Parameter3/@Parameter4. Таблица 1 имеет только 3 столбца (Id, Parameter, Value).

Кто-нибудь знает, как оптимизировать этот запрос?

+0

Как вы можете выбрать Id_Unique из таблицы 1? Это не там .. Кроме того, у вас есть указатель на Parametrr, правильно? –

+0

@Strawberry Я считаю, что SQL Server на основе тега –

+1

К сожалению, в SQL есть некоторые места, где оптимизирован оптимизированный по производительности параметр _must_. В этом случае лучшим вариантом является оператор MERGE, который, вероятно, будет повторяться. –

ответ

0

Вы можете поместить свои параметры и их значения в переменную таблицы, а затем выполнить один оператор MERGE, если версия экземпляра SQL Server поддерживает его (2008 и последующие).

Такие, как:

-- Incoming set of parameter values 
declare @x xml = N'<Parameters> 
    <Item Name="Parameter1" Value="Value1" /> 
    <Item Name="Parameter2" Value="Value2" /> 
    <Item Name="Parameter3" Value="Value3" /> 
    <Item Name="Parameter4" Value="Value4" /> 
</Parameters>'; 

declare @t table(
    Name varchar(100) primary key, 
    Value nvarchar(max) not null 
); 

insert into @t (Name, Value) 
select t.c.value('./@Name', 'varchar(100)') as [Name], 
    t.c.value('./@Value', 'nvarchar(max)') as [Value] 
from @x.nodes('/Parameters[1]/Item') t(c); 

merge dbo.Table1 t 
using (select * from @t) s 
on t.Parameter = s.Name 
when not matched by target then 
    insert (Parameter, Value) 
    values (s.Name, s.Value) 
when matched then 
    update set Value = s.Value; 

Или, вы можете использовать любой другой способ для заполнения переменной таблицы, наиболее подходящий в вашей ситуации - что до вас.