sql - SQL Server 2008 中的循环插入语句

标签 sql sql-server loops sql-insert

如果您能提供任何帮助,我们将不胜感激。

我有以下两张表

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 以及 TS_DEF_TRADER 中是否缺少 GRP_CD = STANLIB_MULTI_MANAGER 的 USER_CD。如果缺少任何内容,它将插入相关行。

我写了以下声明:

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

我需要它自行运行(即:循环)并在需要时停止一次,这样我们就不会得到 NULL。

最佳答案

这根本不需要循环,您只需执行一个 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 列,而不是以这种方式分配值。当另一个用户尝试向该表插入值时会发生什么?您可能会插入重复的 id。

关于sql - SQL Server 2008 中的循环插入语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555226/

相关文章:

C编程Listnode插入节点导致无限循环

mysql - 如果来自另一个表,如何填充(与其他表连接)空值?

c - 获取所有素数

sql - 如何在 Visual Studio 中执行单元测试之前执行 SQL 脚本来准备数据库

sql-server - 查找写入 SQL Server 中事务日志的内容?

sql-server - 使用 SSMA 将 Access 2007 数据库应用程序迁移到 SQL Server 2005 - 问题

两个或多个值冲突时的 SQL Server 存储过程顺序

java - 使用循环和数组在 Java 中生成随机数列表

mysql - 插入新表时计算年龄

mysql - 是否可以从不同的数据库中获取 LAST_INSERT_ID()?