Abuamer Ответов: 1

Обновление двух таблиц в то же время после проверки, если запись существует.SQL сервер 2012


я разрабатываю aquery, который обновляет две таблицы одновременно с помощью user_defined_Table_types
(Tbl_addition_Store и Tbl_item_Journals)

tbl_addition_store (add_id,дата,product_id,Supplier_id,Конти,цена,стоимость)

Tbl_Journals(journal_id,add_id,дата,product_id,Supplier_id,Конти,цена,стоимость)
я создал два типа user_defined_Table_types
первый называется import_products
CREATE TYPE [dbo].[Import_Products] AS TABLE(
	[add_num] [bigint] NULL,
	[add_Date] [date] NULL,
	[product_id] [int] NULL,
	[Supp_id] [int] NULL,
	[quantity] [decimal](18, 2) NULL,
	[price] [decimal](18, 2) NULL,
	[value] [decimal](18, 2) NULL
)
а второй тип называется Insert_Items_Journals
CREATE TYPE [dbo].[Insert_Items_Journals] AS TABLE(
	[Add_Num] [bigint] NULL,
	[date] [date] NULL,
	[Product_Id] [int] NULL,
	[Supp_Id] [int] NULL,
	[Quantity] [decimal](18, 0) NULL,
	[Price] [decimal](18, 0) NULL,
	[Value] [decimal](18, 0) NULL
)

после этого я создал хранимую процедуру import_All_Items .я хочу сохранить значения из моего datagridview внутри двух таблиц с помощью этой хранимой процедуры.Я хочу, чтобы запрос сначала проверил, существуют ли значения, и если они существуют, то запрос обновит количество.если он не существовал, то запрос добавит новую запись .проблема в том, что запрос сохраняет данные внутри tbl_addition_store из первой строки, но в tbl_item_Journals он сохраняет данные из второй строки

Что я уже пробовал:

create proc [dbo].[import_All_Items]
	@import_product Import_Products readonly,
	@Insert_Items_Journals Insert_Items_Journals readonly
as
	declare @adition cursor
	set @adition =cursor for(select add_num, add_Date,product_id,Supp_id,supp_name,quantity,price,value from @import_product)
	open @adition

	declare @add_num bigint,@add_date date,@productid int,@Supp_id int,@supp_name nvarchar(150),@quantity decimal(18,2),@price decimal(18,2),@value decimal(18,2)

	fetch @adition into @add_num,@add_date,@productid,@Supp_id,@supp_name,@quantity,@price,@value
	while @@FETCH_STATUS=0
	begin 
		declare @insert_Journal cursor
		set @insert_Journal =cursor for(select Add_Num,date,Product_Id,Supp_Id,Quantity,Price,Value from @Insert_Items_Journals)
		open @insert_Journal
		fetch first from @insert_Journal into @add_num,@add_date,@productid,@Supp_id,@quantity,@price,@value
		while @@FETCH_STATUS=0
		begin
			if exists (select Add_Id from Tbl_Addition_Store where Date=@add_date and Product_Id=@productid)
			begin
				update Tbl_Addition_Store set Quantity=quantity+@quantity,Value=Value+@value
				where Add_Id=(select Add_Id from Tbl_Addition_Store where Date=@add_date and Product_Id=@productid)

				update Tbl_Item_Journals set Quantity=quantity+@quantity,Value=Value+@value
				where Add_Sarf_Id=(select Add_Sarf_Id from Tbl_Item_Journals where journal_date=@add_date and product_id=@productid)
			end
			else 
			begin
				INSERT INTO [dbo].[Tbl_Addition_Store]
				([Add_Num]
				,[Date]
				,[Product_Id]
				,[Supp_Id]
				,[Supp_Name]
				,[Quantity]
				,[Price]
				,[Value])
				values (@add_num,@add_date,@productid,@Supp_id,@supp_name,@quantity,@price,@value)
				fetch next from @adition into @add_num,@add_date,@productid,@Supp_id,@supp_name,@quantity,@price,@value

				INSERT INTO [dbo].[Tbl_Item_Journals]
				(Add_Sarf_Id,
				[journal_date]
				,[product_id]
				,[supp_id]

				,[quantity]
				,[price]
				,[value])
				VALUES
				(@add_num,@add_date,@productid,@supp_id,@quantity,@price,@value)
				fetch next from @insert_Journal into @add_num,@add_date,@productid,@Supp_id,@quantity,@price,@value
			end
			fetch @adition into @add_num,@add_date,@productid,@Supp_id,@supp_name,@quantity,@price,@value
			fetch @insert_Journal into @add_num,@add_date,@productid,@Supp_id,@quantity,@price,@value
		end 
		fetch @adition into @add_num,@add_date,@productid,@Supp_id,@supp_name,@quantity,@price,@value
	end 

CHill60

Почему вы используете курсор? Было бы гораздо лучше использовать EXISTS и update/insert в наборах данных (в конце концов, SQL-это язык, основанный на множествах)

ZurdoDev

Я согласен с ^. Ты не понимаешь,-усложняет ее.

Если существует (выберите 1 из таблицы, где id = @id)
НАЧАТЬ
-- сделайте обновление
КОНЕЦ
ЕЩЕ
НАЧАТЬ
-- сделайте вставку
КОНЕЦ

Abuamer

спасибо вам за помощь, большое спасибо

Richard Deeming

Репост
Вы уже опубликовали это сообщение:
https://www.codeproject.com/Questions/1264210/How-can-I-save-values-from-two-tables-at-the-same[^]

1 Ответов

Рейтинг:
5

ZurdoDev

Как уже упоминалось в комментариях, вы захотите сделать что-то гораздо более простое, например

IF EXISTS (SELECT 1 FROM table WHERE id = @id)
  BEGIN
    -- do an update
  END
ELSE
  BEGIN
    -- do an insert
  END


Abuamer

спасибо тебе, Зурдодев, спасибо за Твою поддержку.