2014-02-04 5 views
2

Любая помощь, которая может быть предоставлена, будет высоко оценена.Оператор с привязкой в ​​SQL Server 2008

У меня есть следующие две таблицы

TS_DEF_TRADER:

DEF_TRADER_ID MANAGER_CD  INV_CLASS_CD TRADER_CD 
------   -------   ----------  --------- 
101   HARRIT   EQTY   MMGR_DT 
108   NAIDON   EQTY   MMGR_DT 
123   MLONDG   EQTY   MMGR_DT 

и PDF_USER_GROUP:

GRP_CD     USER_CD  
------     -------   
STANLIB_MULTI_MANAGER  HARRIT   
STANLIB_MULTI_MANAGER  NAIDON   
STANLIB_MULTI_MANAGER  MLONDG 
STANLIB_MULTI_MANAGER  FARRYM 
STANLIB_MULTI_MANAGER  HOLMEM 

То, что я хочу сделать, это создать своего рода оператора вставки петлевой SQL (если это правильная терминология), которая проверит файл PDF_USER_GROUP и будет ли USER_CD с GRP_CD = STANLIB_MULTI_MANAGER, отсутствующим в TS_DEF_TRADER. Если ничего не хватает, то он вставляет соответствующую строку.

Я написал ниже заявление:

declare @DefTraderID INT 
declare @Mgr varchar(200) 
set @DefTraderID = (select MAX(DEF_TRADER_ID) + 1 from TS_DEF_TRADER) 
set @Mgr = (select min(USER_CD) from PDF_USER_GROUP where not exists 
(select * from TS_DEF_TRADER where 
TRADER_CD = 'MMGR_DT' and 
INV_CLASS_CD = 'EQTY' and 
TS_DEF_TRADER.MANAGER_CD = PDF_USER_GROUP.USER_CD) 
and GRP_CD = 'STANLIB_MULTI_MANAGER' and USER_CD not in ('MMGR_DT', 'SLIB_INDEX')) 


insert into TS_DEF_TRADER (DEF_TRADER_ID,MANAGER_CD,INV_CLASS_CD, TRADER_CD) 
values (@DefTraderID,@Mgr, 'EQTY', 'MMGR_DT') 

Если я запускаю это вручную сам дважды, я получаю следующий результат, что я хочу:

DEF_TRADER_ID MANAGER_CD  INV_CLASS_CD TRADER_CD 
------   -------   ----------  --------- 
101   HARRIT   EQTY   MMGR_DT 
108   NAIDON   EQTY   MMGR_DT 
123   MLONDG   EQTY   MMGR_DT 
124   FARRYM   EQTY   MMGR_DT 
125   HOLMEM   EQTY   MMGR_DT 

Если бы я был бежать это в третий раз это произойдет:

DEF_TRADER_ID MANAGER_CD  INV_CLASS_CD TRADER_CD 
------   -------   ----------  --------- 
101   HARRIT   EQTY   MMGR_DT 
108   NAIDON   EQTY   MMGR_DT 
123   MLONDG   EQTY   MMGR_DT 
124   FARRYM   EQTY   MMGR_DT 
125   HOLMEM   EQTY   MMGR_DT 
126   NULL    EQTY   MMGR_DT 

мне это нужно запустить сам по себе (т.е. петли) и остановки один раз, когда она урожденная ds, поэтому мы не получаем NULL.

+0

Чтобы использовать то, что вы хотите, если существует файл PDF_User_Group.User_CD, который не существует в TS_def_Trader.Manager_CD и PDF_User_Group.GRP_CD == STANLIB_MULTI_MANGER. Вы хотите добавить его в TS_Def_trader? – gh9

ответ

1

Вы можете использовать цикл WHILE, и постоянно оценивать @Mgr для NULL:

declare @DefTraderID INT; 
declare @Mgr varchar(200); 

set @DefTraderID = (select MAX(DEF_TRADER_ID) + 1 from TS_DEF_TRADER); 
set @Mgr = (select min(USER_CD) from PDF_USER_GROUP where not exists 
(select * from TS_DEF_TRADER 
    where 
    TRADER_CD = 'MMGR_DT' and 
    INV_CLASS_CD = 'EQTY' and 
    TS_DEF_TRADER.MANAGER_CD = PDF_USER_GROUP.USER_CD) 
    and GRP_CD = 'STANLIB_MULTI_MANAGER' 
    and USER_CD not in ('MMGR_DT', 'SLIB_INDEX')); 


WHILE (@Mgr IS NOT NULL) 
    BEGIN 

    insert into TS_DEF_TRADER (DEF_TRADER_ID,MANAGER_CD,INV_CLASS_CD, TRADER_CD) 
    values (@DefTraderID, @Mgr, 'EQTY', 'MMGR_DT'); 

    set @DefTraderID = (select MAX(DEF_TRADER_ID) + 1 from TS_DEF_TRADER); 
    set @Mgr = (select min(USER_CD) from PDF_USER_GROUP where not exists 
    (select * from TS_DEF_TRADER 
     where 
     TRADER_CD = 'MMGR_DT' and 
     INV_CLASS_CD = 'EQTY' and 
     TS_DEF_TRADER.MANAGER_CD = PDF_USER_GROUP.USER_CD) 
     and GRP_CD = 'STANLIB_MULTI_MANAGER' 
     and USER_CD not in ('MMGR_DT', 'SLIB_INDEX')); 

    END 

С очевидной оговоркой, что @Mgr должно быть NULL в какой-то момент в противном случае вы будете цикл навсегда.

AFAIK нет DO..WHILE/REPEAT..UNTIL конструкт в SqlServer, однако вы можете высушить дублированный оценку @Mgr + @DefTraderwith one of these workarounds ~ GOTO :(

Кроме того, это может быть хорошей идеей, чтобы пересмотреть приращение @DefTrader, а именно (select MAX(DEF_TRADER_ID) + 1 from TS_DEF_TRADER), например, с IDENTITY колонки или запертым шаблоном счетчиков - на данный момент, код не является одновременно безопасным

+0

Спасибо. Решения работают на 100%. Я согласен с вами в отношении столбца Identity, однако таблица представляет собой системную таблицу, поэтому я не хочу добавлять дополнительные столбцы.DEF_TRADER_ID является первичным ключом, однако дубликаты не должны допускаться. – Andrew

+0

Обратите внимание, что у Lamak есть хороший момент, хотя, если это вообще возможно, попробуйте использовать подход, основанный на наборе, для обработки, поскольку это будет иметь преимущества производительности и масштабируемости :-) – StuartLC

3

Это не нуждается в петле на всех, вы можете просто сделать один INSERT заявления:.

DECLARE @MaxDefTraderId INT 

SELECT @MaxDefTraderId = MAX(DEF_TRADER_ID) 
FROM TS_DEF_TRADER 

INSERT INTO TS_DEF_TRADER(DEF_TRADER_ID, MANAGER_CD, INV_CLASS_CD, TRADER_CD) 
SELECT @MaxDefTraderId + ROW_NUMBER() OVER(ORDER BY USER_CD) DEF_TRADER_ID, 
     USER_CD MANAGER_CD, 
     'EQTY' INV_CLASS_CD, 
     'MMGR_DT' TRADER_CD 
FROM PDF_USER_GROUP A 
WHERE GRP_CD = 'STANLIB_MULTI_MANAGER' 
AND NOT EXISTS(SELECT 1 FROM TS_DEF_TRADER 
       WHERE MANAGER_CD = A.USER_CD) 

Here is a demo с этим. И результаты:

╔═══════════════╦════════════╦══════════════╦═══════════╗ 
║ DEF_TRADER_ID ║ MANAGER_CD ║ INV_CLASS_CD ║ TRADER_CD ║ 
╠═══════════════╬════════════╬══════════════╬═══════════╣ 
║   101 ║ HARRIT  ║ EQTY   ║ MMGR_DT ║ 
║   108 ║ NAIDON  ║ EQTY   ║ MMGR_DT ║ 
║   123 ║ MLONDG  ║ EQTY   ║ MMGR_DT ║ 
║   124 ║ FARRYM  ║ EQTY   ║ MMGR_DT ║ 
║   125 ║ HOLMEM  ║ EQTY   ║ MMGR_DT ║ 
╚═══════════════╩════════════╩══════════════╩═══════════╝ 

Теперь я должен предупредить вас о том, как вы вычисляющей DEF_TRADER_ID. Вы должны использовать столбец IDENTITY вместо назначения значения таким образом. Что происходит, когда другой пользователь пытается вставить значения в эту таблицу ?, вы можете вставлять идентификаторы дубликатов.

+0

Спасибо. Решения работают на 100%. Я согласен с вами в отношении столбца Identity, однако таблица представляет собой системную таблицу, поэтому я не хочу добавлять дополнительные столбцы. DEF_TRADER_ID является первичным ключом, однако дубликаты не должны допускаться. – Andrew

Смежные вопросы