【问题标题】:How to insert extra rows into the same table using cursor and increase a column value of the new records如何使用游标在同一个表中插入额外的行并增加新记录的列值
【发布时间】:2015-11-15 13:38:36
【问题描述】:

在 SQL Server 中,我希望每个SELECT 结果每次都在同一个表中插入三个新行,itemid = max itemid + counter

例如:

(ItemID, PackageID, ItemTypeID, ServiceID, ItemName, CreatedDate) 
VALUES
    (17891, 5352, 7007, 2011, N'Firewall''s Lan NIC', '11/11/2015 6:50:51  PM'),
    (17892, 5352, 7008, 2011, N'Firewall''s Mng NIC', '11/11/2015 6:50:51 PM'),
    (17893, 5352, 7006, 2011, N'Firewall''s Wan NIC', '11/11/2015 6:50:51 PM')
  • ItemID = 主键
  • PackageID = 来自选择查询
  • ItemTypeID = 原样
  • ServiceID = 来自选择查询
  • ItemName = 原样
  • CreatedDate = 现在

我正在尝试这个循环遍历SELECT 结果。

DECLARE @item_id int, 
@package_id nvarchar(50),
@itemtype_id varchar(80), 
@item_name varchar(80), 
@service_id nvarchar(50);

DECLARE @message nvarchar(150)
PRINT '-------- Service Items Report --------';

DECLARE serviceitems_cursor CURSOR FOR 
SELECT PackageID, ItemID
FROM ServiceItems
WHERE ItemTypeID = '7004' 
ORDER BY ItemID;

OPEN serviceitems_cursor

FETCH NEXT FROM serviceitems_cursor 
INTO @package_id, @itemtype_id

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT ' '
    SELECT @message = '-----Service Items from serviceitems_cursor  - packageId: ' + @package_id
    PRINT @message
        -- I want here to add three new rows 
        -- For every new item row I want itemid to be SELECT MAX(ItemID) + thecounter  FROM ServiceItems  
        -- /thecounter is the new counter after each insertion
    FETCH NEXT FROM serviceitems_cursor 
    INTO @package_id, @itemtype_id
END 
CLOSE serviceitems_cursor;
DEALLOCATE serviceitems_cursor;

如何执行所有新记录以获得当前最大 itemid + 计数器

SELECT MAX(ItemID) + 1  FROM ServiceItems ) 

例如,如果最大 itemId 为 17890,则新记录将有

 17891, 17892, 17893 

(前三行插入)

17894, 17895, 17896 

(后三行插入)等

【问题讨论】:

  • 听起来你想要一个触发器,而不是一个光标。
  • 好的,@GordonLinoff 让我试试触发器。
  • 或者您只是想要一个identity 列?

标签: sql sql-server cursor sql-insert


【解决方案1】:

通过两种方式可以实现,

(1)获取ItemId的最大值,放入一个局部变量中。

Declare @max_itemid int =(select max (itemid ) from services ) 

已经通过游标循环,您在局部变量中拥有所有剩余的列值。 (来自选择查询)

现在您需要做的就是插入。 (使用联合所有)

Insert into services (
<column list >)
Select @max_itemid+1 as item_id, @pkg, @service_id, get date()
UNION ALL 
Select @max_itemid+2 as item_id, @pkg, @service_id, get date()
UNION ALL 
Select @max_itemid+3 as item_id, @pkg, @service_id, get date()

上面提到的所有代码都应该在@@fetch状态块里面

(2) 方法二很简单,不需要每次都取最大值并递增,将 item_id 设为标识列。 (不确定您的业务需求,因此您决定)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多