Достигание дочерних рекордных отметок в таблице SQL Server

Из моего отсутствия опыта SQL Server и принимая во внимание, что этой задачей является обычная для приложений Направления деятельности, я хотел бы спросить, возможно, существует стандарт, распространенный способ сделать следующую операцию базы данных:

Предположите, что у нас есть две таблицы, соединенные друг с другом связью "один ко многим", например SalesOderHeader и SalesOrderLines

http://s43.radikal.ru/i100/1002/1d/c664780e92d5.jpg

Поле SalesHeaderNo PK в SalesOderHeader таблица и FK в SalesOrderLines таблица.

В приложении фронтенда Пользователь выбирает некоторое количество записей в SalesOderHeader таблица, с помощью, например, Диапазон дат, или IsSelected поле путем нажатия на поля флажка в GridView. Затем Пользователь выполняет, некоторые операции (позвольте, это быть просто "перемещается в другую таблицу") на выбранном диапазоне Заказов на покупку.

Мой вопрос:

Как в этом случае я могу достигнуть дочерних рекордных отметок в SalesOrderLines таблица для выполнения тех же операций (в нашем случае "перемещаются в другую таблицу") по этим дочерним записям максимально легким, корректным, быстрым и изящным способом?

5
задан rem 24 February 2010 в 21:14
поделиться

3 ответа

Если вас устраивает решение на основе T-SQL (в отличие от C # / LINQ ) - вы можете сделать что-то вроде этого:

-- define a table to hold the primary keys of the selected master rows
DECLARE @MasterIDs TABLE (HeaderNo INT)

-- fill that table somehow, e.g. by passing in values from a C# apps or something

INSERT INTO dbo.NewTable(LineCodeNo, Item, Quantity, Price)
   SELECT SalesLineCodeNo, Item, Quantity, Price 
   FROM dbo.SalesOrderLine sol
   INNER JOIN @MasterIDs m ON m.HeaderNo = sol.SalesHeaderNo

С его помощью вы можете вставить целый набор строк из вашей дочерней таблицы в новую таблицу на основе критериев выбора.

2
ответ дан 15 December 2019 в 00:59
поделиться

Ваш вопрос все еще немного туманен для меня, поскольку я не совсем понимаю, что подразумевается под "переместить в другую таблицу". Означает ли это, что существует другая таблица с точной схемой обеих ваших таблиц-образцов?

Однако, вот попытка решения. Когда пользователь фиксирует запись SalesOrderHeader, будет выполнена некоторая операция, которая выглядит так:

Update SalesOrderHeader
Set....
Where SalesOrderHeaderNo = @SalesOrderHeaderNo

Or

Insert SomeOtherTable
Select ...
From SalesOrderHeader 
Where SalesOrderHeaderNo = @SalesOrderHeaderNo

В этой же операции есть причина, по которой вы не можете также сделать что-то со строками, например:

Insert SomeOtherTableItems
Select ...
From SalesOrderLineItems
Where SalesOrderHeaderNo = @SalesOrderHeaderNo
1
ответ дан 15 December 2019 в 00:59
поделиться

Я не знаю о "лучшей практике", но вот что я использую:

 var header = db.SalesOrderHeaders.SingleOrDefault(h => h.SaleHeaderNo == 14);
 IEnumerable<SalesOrderLine> list = header.SalesOrderLines.AsEnumerable();

 // now your list contains the "many" records for the header
 foreach (SalesOrderLine line in list)
 {  
      // some code
 }

Я попытался смоделировать ее по образцу вашей таблицы, но названия могут быть немного другими.

Я не уверен, является ли это способом "лучшей практики".

РЕДАКТИРОВАНО: Заметил, что вы хотите обновить их все, возможно, переместить в другую таблицу. Поскольку LINQ-To-SQL не может выполнять массовые вставки/обновления, вам, вероятно, лучше использовать для этого T-SQL.

1
ответ дан 15 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: