Вставка строки в таблицу в зависимости от значений столбцов в другой таблице в MSSQL

#sql-server #stored-procedures

#sql-сервер #хранимые процедуры

Вопрос:

У меня есть таблица с именем reportValues:

 id isNew isExclusive isPremium
10  1       1          0 
11  0       0          1
12  1       0          1
  

и у меня есть таблица с именем productProperties

isNew имеет PropertyID равный 1, isExclusive имеет PropertyID равный 2, а isPremium имеет PropertyID равный 3.

 id propertyId
10 1
10 2
11 3
12 1
12 3
  

Мне нужно добавить строки в productProperties в зависимости от логических значений значений таблицы reportValues, как вы это делаете с помощью хранимой процедуры? Я думаю, вам нужен какой-то оператор if, но я не смог найти пример.

Комментарии:

1. добавление строк в productProperties в зависимости от логических значений значений таблицы reportValues : пожалуйста, опишите логику, которую вы хотите. Вы не дали ни малейшего представления о том, как интерпретировать флаги.

Ответ №1:

Я думаю, вы ищете что-то вроде этого. Логические значения не выводятся с использованием CROSS APPLY и присваиваются идентификаторам свойств 1,2,3. Затем в преобразованные значения вставляется WHERE логическое свойство TRUE , т.е. v.свойство=1. Следующая хранимая процедура вставляет в таблицу productProperties и проверяет, чтобы убедиться, что значения еще не существуют. Может быть, в этом нет необходимости? Это может быть закомментировано или удалено.

 drop proc if exists dbo.productPropertiesInsert;
go
create proc  dbo.productPropertiesInsert
as
set nocount on;

insert productProperties
select v.id, v.propertyId
from reportValues rv
     cross apply (values (1, rv.id, rv.isNew), 
                         (2, rv.id, rv.isExclusive), 
                         (3, rv.id, rv.isPremium)) 
                         v(propertyId, id, property)
where v.property=1
      /* optional code? */
      and not exists(select 1 
                     from productProperties p_in
                     where v.id=p_in.id
                           and v.propertyId=p.propertyId);
go