Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как правильно написать процедуру?...  [new]
lewis
Member

Откуда:
Сообщений: 8
Буду благодарен, если метры помогут:

Есть в основной базе таблица со множеством полей, постоянно обновляется, сталбыть для репликации не годится. Есть вторая база, в ней таблица поменьше, там только те поля, что нужны для репликации. По следующей процедуре:
CREATE PROCEDURE [BMSSA].[st_erg_pricegrcustqualifiers4sitex] AS
insert into DB30_NEW.BMSSA.ERG_PRICEGRCUSTQUALIFIERS (CUSTACCOUNT,PRICEGROUPID,SV_CONSUMERPROPERTYSGROUPID,RECID)
SELECT CUSTACCOUNT,PRICEGROUPID,SV_CONSUMERPROPERTYSGROUPID,RECID
FROM DB30.bmssa.ERG_PRICEGRCUSTQUALIFIERS
GO

вносятся новые данные.
Плюс к тому же репликации требуются ключевые поля в таблице, а процедура на это отвечает:
Violation of PRIMARY KEY constraint 'PK_RECID'. Cannot insert duplicate key in object 'ERG_PRICEGRCUSTQUALIFIERS '
Процедура должна дополнять поля если таких RECID нет и обновлять, если уже имеются... Подскажите, как?

Спасибо!
21 ноя 03, 14:27    [428384]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать процедуру?...  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Вариант 1:

if exists ( select ... where RECID = @RECID )

update ... set ... where RECID = @RECID
else
insert into ...


Вариант 2:

update ... set ... where RECID = @RECID

if @@rowcount = 0
insert into ...
21 ноя 03, 15:09    [428483]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать процедуру?...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
CREATE PROCEDURE [BMSSA].[st_erg_pricegrcustqualifiers4sitex]

AS
SET XACT_ABORT ON
BEGIN TRAN
--Обновляем существующие

UPDATE DB30_NEW.BMSSA.ERG_PRICEGRCUSTQUALIFIERS
SET
CUSTACCOUNT = T1.CUSTACCOUNT,
PRICEGROUPID = T1.PRICEGROUPID,
SV_CONSUMERPROPERTYSGROUPID = T1.SV_CONSUMERPROPERTYSGROUPID
FROM
DB30.bmssa.ERG_PRICEGRCUSTQUALIFIERS T1
INNER JOIN DB30_NEW.BMSSA.ERG_PRICEGRCUSTQUALIFIERS T2 ON
T1.RECID = T2.RECID
--Вставляем новые

INSERT DB30_NEW.BMSSA.ERG_PRICEGRCUSTQUALIFIERS
(CUSTACCOUNT,PRICEGROUPID,SV_CONSUMERPROPERTYSGROUPID,RECID)
SELECT CUSTACCOUNT,PRICEGROUPID,SV_CONSUMERPROPERTYSGROUPID,RECID
FROM DB30.bmssa.ERG_PRICEGRCUSTQUALIFIERS T1
WHERE NOT EXISTS (SELECT 1 FROM
B30_NEW.BMSSA.ERG_PRICEGRCUSTQUALIFIERS T2
WHERE T1.RECID = T2.RECID)
COMMIT TRAN
RETURN(0)
21 ноя 03, 15:21    [428509]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить