#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