2015-07-07 3 views
0

У меня есть параметр @supplierData табличное значение в хранимой процедуре, которая имеет столбцы следующимВставить таблицу параметров в 2 разные таблицы в хранимой процедуре

sName | sLocation | currYearExpt | currYearImpt | prevYearExpt | prevYearImpt 
---------- 
XXX | USA  | 1000   | 2000   | 1000   | 2050 
YYY | U.K  | 8000   | 12000  | 10000  | 29000 

таблица должна быть вставлена ​​ниже 2 таблиц

SUPPLIER стол:

sId  | sName | sLocation | 
(Identity) |  |   | 
---------- 
1   | XXX | USA  | 
2   | YYY | U.K  | 

и

SUPPLIERRECORD стол:

YearId | sId | currYearExpt | currYearImpt | prevYearExpt | prevYearImpt| 
---------- 
1  | 1 | 1000   | 2000   | 1000   | 2050  | 
2  | 2 | 8000   | 12000  | 10000  | 29000  | 

Где в 2-й стол, имеющий ссылку на sId, созданной в рамках одной и той же хранимой процедуры.

Должен ли я вставить запись по записи от @supplierData параметр?

ответ

1

Вы можете использовать функцию DENSE_RANK (https://msdn.microsoft.com/en-us/library/ms173825.aspx) с более чем указать порядок и критерий разбиения. Таким образом, вы получите числовые идентификаторы для ваших поставщиков. Вы можете сначала вставить их в параметр таблицы, а затем использовать это для своих двух INSERT

+0

, почему здесь нужен DENSE_RANK? –

+0

Это не совсем понятно, но я бы предположил, что первоначально опубликованные строки - это просто примеры. Я бы предположил, что для каждого поставщика существует несколько строк. DENSE_RANK с PARTITION BY sName, sLocation создаст четкие «идентификаторы» для поставщиков ... – Shnugo

0

Здесь вы находитесь. Пусть использовать insert into select или select into, они созданы, чтобы сделать вид этого:

DECLARE @supplierData TABLE 
(
    sName nvarchar(50), 
    sLocation nvarchar(50), 
    currYearExpt int, 
    currYearImpt int, 
    prevYearExpt int, 
    prevYearImpt int 
); 

DECLARE @SUPPLIER TABLE 
(
    sId int, 
    sName nvarchar(50), 
    sLocation nvarchar(50) 
); 
insert into @SUPPLIER values(1,'XXX','USA'); 
insert into @SUPPLIER values(2,'YYY','U.K'); 

DECLARE @SUPPLIERRECORD TABLE 
(
    YearId int, 
    sId int, 
    currYearExpt int, 
    currYearImpt int, 
    prevYearExpt int, 
    prevYearImpt int 
); 
insert into @SUPPLIERRECORD values(1,1,1000,2000,1000,2050);  
insert into @SUPPLIERRECORD values(2,2,8000,12000,10000,29000); 

insert into @supplierData 
select a.sName, a.sLocation, b.currYearExpt, b.currYearImpt, b.prevYearExpt, b.prevYearImpt 
from @SUPPLIER a inner join @SUPPLIERRECORD b on a.sId = b.sId 

select * from @supplierData 

Надеется, что это помогает.

+0

Я вполне уверен, что первоначально опубликованные значения являются лишь примерами. Вызов должен состоять в том, чтобы добиться этого со многими рядами и с несколькими рядами на одного поставщика. Посмотрите на мой ответ о DENSE_RANK – Shnugo

+0

Да, значения - это только образцы, sId является личным и создается при добавлении записи Поставщика. То же самое значение необходимо вставить в таблицу SupplierRecord. – hozefam

0

Да, вы можете использовать insert into .. select from построить, как показано ниже

insert into SUPPLIER(sName , sLocation) 
select sName , sLocation 
from @supplierData; 

insert into SUPPLIERRECORD (currYearExpt , currYearImpt , prevYearExpt , prevYearImpt) 
select currYearExpt , currYearImpt , prevYearExpt , prevYearImpt 
from @supplierData; 
+0

Это не будет охватывать (достаточно вероятную) проблему с несколькими рядами на одного поставщика/лет. Посмотрите на мой ответ о DENSE_RANK – Shnugo

Смежные вопросы