简体   繁体   English

如何使用sql游标更新sql server数据库中的数据?

[英]How to update data in sql server database with the sql cursor?

I am trying to develop a inventory management system. 我正在尝试开发一个库存管理系统。 But problem is when i am going to stock in my stock table then these product quantities are need to need update in item table at a time. 但是问题是当我要在库存表中库存时,这些产品数量需要一次在项目表中更新。 As a example, I am going to increase stock 100s of products in stock table when i will press save button all of the products which of them are status='Posting' will be updated with tbl_item.quantity+tbl_stock.qty in according to itemcode. 例如,当我按下保存按钮时,我要增加库存表中100种产品的库存,其中所有状态为'Posting'的产品将根据项目代码更新为tbl_item.quantity + tbl_stock.qty 。 Please help me... 请帮我...

Here is my table where i am increasing stock. 这是我要增加库存的桌子。

CREATE TABLE [dbo].[tbl_Addstock](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [ItemCode] [varchar](50) NOT NULL,
    [ItemName] [varchar](250) NOT NULL,
    [qty] [decimal](18, 2) NOT NULL,
    [sdate] [date] NOT NULL,
    [sadmin] [varchar](50) NOT NULL,
    [Status] [varchar](50) NULL,
 CONSTRAINT [PK_tbl_Addstock] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] 

Here is my another item table where i want to update my total stock information. 这是我要更新我的总库存信息的另一个项目表。

CREATE TABLE [dbo].[tbl_Item](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [nvarchar](50) NOT NULL,
    [batchno] [nvarchar](50) NOT NULL,
    [brand] [nvarchar](50) NOT NULL,
    [itemcode] [varchar](50) NOT NULL,
    [catg] [nvarchar](50) NOT NULL,
    [supplier] [nvarchar](50) NULL,
    [unitType] [nvarchar](50) NOT NULL,
    [Quantity] [decimal](18, 2) NULL,
    [buyingPrice] [money] NULL,
    [sellingPrice] [money] NULL,
    [qtyLimit] [int] NULL,
    [vat] [decimal](18, 2) NULL,
 CONSTRAINT [PK_tbl_Item] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] 

Then I have tried a cursor query.. 然后我尝试了一个游标查询。

USE [NMCPMC]
GO
/****** Object:  StoredProcedure [dbo].[sp_UpdateItem]    Script Date: 01/07/2015 12:41:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--exec sp_UpdateItem
ALTER PROCEDURE [dbo].[sp_UpdateItem] 
AS
BEGIN
SET NOCOUNT ON
DECLARE 
    @TEMP                        AS VARCHAR(50), @ItemCode varchar(20),
    @eqty decimal(18,2)

DECLARE ITEM_CURSOR CURSOR FOR
SELECT ItemCode,qty FROM tbl_Addstock 
OPEN ITEM_CURSOR
    FETCH NEXT FROM ITEM_CURSOR
INTO @ItemCode,@TEMP

WHILE (@@FETCH_STATUS = 0)
BEGIN
    --set @eqty = (select Quantity from tbl_Item)
 --   SELECT @TEMP = SUM(ti.Quantity+ta.qty) from tbl_Addstock ta inner join tbl_Item ti on ta.ItemCode=ti.itemcode
 --   UPDATE tbl_Item SET Quantity = @TEMP WHERE CURRENT OF ITEM_CURSOR
 if exists(select * from tbl_Addstock where ItemCode=@ItemCode)
  begin 
   UPDATE tbl_Addstock SET qty = qty+@TEMP WHERE ItemCode=@ItemCode
   update tbl_Addstock set qty=qty-@TEMP WHERE ItemCode=@ItemCode
  end
  else
  begin
--  insert into tbl_Addstock
  update tbl_Addstock set qty=qty-@TEMP WHERE ItemCode=@ItemCode 
  end
    print @ItemCode
    print @TEMP
    FETCH NEXT FROM ITEM_CURSOR
    INTO @ItemCode,@TEMP
END

CLOSE ITEM_CURSOR
DEALLOCATE ITEM_CURSOR

SET NOCOUNT OFF
END
--EXEC sp_UpdateItem 

So you want to add to the tbl_Item the quantity expressed in your tbl_AddStock. 因此,您想将tbl_AddStock中表示的数量添加到tbl_Item中。 Your SP doesn't seem to work correctly because you never touch the quantuty field of the table tbl_Item. 您的SP似乎无法正常工作,因为您从未触摸过表tbl_Item的数量字段。

I would write instead 我会写

ALTER PROCEDURE [dbo].[sp_UpdateItem] 
AS
BEGIN
SET NOCOUNT ON
DECLARE 
    @ItemCode varchar(20),
    @eqty decimal(18,2)

DECLARE ITEM_CURSOR CURSOR FOR
SELECT ItemCode,qty FROM tbl_Addstock WHERE Status = 'Posting'
OPEN ITEM_CURSOR
FETCH NEXT FROM ITEM_CURSOR
INTO @ItemCode,@eqty

WHILE (@@FETCH_STATUS = 0)
BEGIN
if exists(select * from tbl_Item where ItemCode=@ItemCode)
  begin 
   UPDATE tbl_Item     SET quantity = quantity + @eqty WHERE ItemCode=@ItemCode
   UPDATE tbl_Addstock SET qty = qty - @eqty, Status = 'Posted' WHERE ItemCode=@ItemCode
   -- COULD AVOID THE MATH. SIMPLY SET QTY=0
   -- ? UPDATE tbl_Addstock SET qty      = 0           WHERE ItemCode=@ItemCode
  end
else
  begin
   -- THIS ELSE PART IS WHERE YOU DISCOVER THAT tbl_Item 
   -- HAD NO RECORD FOR THE @ItemCode.
   -- YOU SHOULD ADD THE NEW ITEM TO THE tblItem TABLE
   -- BUT MANY FIELDS OF THAT TABLE ARE NOT NULL (batchno, catg, brand, unittype)
   -- SO YOU NEED TO KNOW THE VALUES FOR THESE
   -- FIELDS OTHERWISE YOU WONT BE ABLE TO ADD ANYTHING 
   -- ??? -> INSERT INTO tbl_Item(ItemCode, Qty) VALUES (@itemcode, @eqty)
  end
  FETCH NEXT FROM ITEM_CURSOR
  INTO @ItemCode,@qty
END
CLOSE ITEM_CURSOR
DEALLOCATE ITEM_CURSOR

SET NOCOUNT OFF
END

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM