Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 procedura Orders Persons  [new]
alex212121
Member

Откуда:
Сообщений: 54
всем привет
заранее благодарю

так, есть два стола Persons и Orders... через процедуру задача, закинуть в Persons информацию personID, name, surname, и после в той же процедуре, автоматически процедура должна взять только что созданный personID и создать запись в Orders

INSERT INTO Persons (personID, name, surname) values (@pid, @name, @surname)
после
что то вроде

take personID возьми и создай в Orders

INSERT INTO Orders (orderid, personID) values (@orderid @pid,)


заело что-то в мозгах и не могу понять как писать эту штуку.

кто может ребя т пожалуйста вам это за 1-нуту удастся набросать скрипт, напишите а пожалуйста, а то башка взрывается уже по всякому думал не идёт чёто






CREATE TABLE Persons
(
personID int not null primary key identity(1,1),
name nvarchar(100),
surname nvarchar(100)
)




create table Orders
(
orderID int not null primary key identity(1,1),
personID int
)



create procedure orderPeerson (@pid int, @name nvarchar(100), @surname nvarchar(100))
AS

set @pid = (select * from Persons as p where p.personID = @pid)
set @name = (select * from Persons as p where p.name = @name)
set @surname = (select * from Persons as p where p.surname = @surname)
TRUNCATE table Persons




BEGIN TRAN
INSERT INTO Persons (personID, name, surname) values (@pid, @name, @surname)
COMMIT TRAN

then

TRUNCATE table Orders




BEGIN TRAN
INSERT INTO Persons (orderid, personID) values (@orderid @pid,)
COMMIT TRAN

exec orderPeerson @pid=1, @name=aleksandr, @surname=popov
15 июн 12, 22:54    [12723425]     Ответить | Цитировать Сообщить модератору
 Re: procedura Orders Persons  [new]
alex212121
Member

Откуда:
Сообщений: 54
alex212121,

ну что? ребята, вы не поняли что я написал или как?
15 июн 12, 23:21    [12723530]     Ответить | Цитировать Сообщить модератору
 Re: procedura Orders Persons  [new]
alex212121
Member

Откуда:
Сообщений: 54
alex212121,

create procedure orderPeerson(@pid int)
AS
begin


set @personid = (select * from Persons1 as p where p.personID = @personid)

insert into Persons2 (personID) values (@personid)
then
take @personid and insert into Orders3 (personID)


end
15 июн 12, 23:38    [12723580]     Ответить | Цитировать Сообщить модератору
 Re: procedura Orders Persons  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+ тем кому глаза режет, чтоб тоже поугорали
alex212121
всем привет
заранее благодарю

так, есть два стола Persons и Orders... через процедуру задача, закинуть в Persons информацию {personID, name, surname}, и после в той же процедуре, автоматически процедура должна взять только что созданный personID и создать запись в Orders
INSERT INTO Persons (personID, name, surname) values (@pid, @name, @surname)

после
что то вроде

take personID возьми и создай в Orders
INSERT INTO Orders (orderid, personID) values (@orderid @pid,)


заело что-то в мозгах и не могу понять как писать эту штуку.

кто может ребя т пожалуйста вам это за 1-нуту удастся набросать скрипт, напишите а пожалуйста, а то башка взрывается уже по всякому думал не идёт чёто
CREATE TABLE Persons
(
personID int not null primary key identity(1,1),
name nvarchar(100),
surname nvarchar(100)
)
create table Orders
(
orderID int not null primary key identity(1,1),
personID int
)
GO
create procedure orderPeerson (@pid int, @name nvarchar(100), @surname nvarchar(100))
AS

set @pid = (select * from Persons as p where p.personID = @pid)
set @name = (select * from Persons as p where p.name = @name)
set @surname = (select * from Persons as p where p.surname = @surname)
TRUNCATE table Persons

		BEGIN TRAN
			INSERT INTO Persons (personID, name, surname) values (@pid, @name, @surname)
		COMMIT TRAN

then

TRUNCATE table Orders

		BEGIN TRAN
			INSERT INTO Persons (orderid, personID) values (@orderid @pid,)
		COMMIT TRAN

   exec orderPeerson @pid=1, @name=aleksandr, @surname=popov
GO
create procedure orderPeerson(@pid int)
AS
begin

set @personid = (select * from Persons1 as p where p.personID = @personid)

insert into Persons2 (personID) values (@personid)
then
take @personid and insert into Orders3 (personID)

end
16 июн 12, 04:26    [12723938]     Ответить | Цитировать Сообщить модератору
 Re: procedura Orders Persons  [new]
londinium
Member

Откуда: Киев
Сообщений: 1199
Ой как мрачно
Можно написать примерно так:
IF OBJECT_ID(N'PROC_AddPersonAndEmptyOrder',N'P')IS NOT NULL
  DROP PROC PROC_AddPersonAndEmptyOrder;
GO

CREATE PROC PROC_AddPersonAndEmptyOrder
@InSurname VARCHAR(50),
@InName     VARCHAR(30)=NULL
AS
 DECLARE @InAddedPersonID INT;
 DECLARE @InAddedPerson TABLE(Person_ID);

 SELECT @InSurname=LTRIM(RTRIM(@InSurname));
 SELECT @InName=LTRIM(RTRIM(ISNULL(@InName,''))); 
 IF(@InSurname='')
  RETURN -1;

 BEGIN TRY
  BEGIN TRAN
      INSERT Person(Surname,Name)
        OUTPUT INSERTED.Person_ID INTO @InAddedPerson
      VALUES(@InSurname,@InName);
  COMMIT TRAN; 
  SELECT @InAddedPersonID=ISNULL(Person_ID,-1)FROM @InAddedPerson;
END TRY
BEGIN CATCH
  ROLLBACK TRAN;
  SELECT @InAddedPersonID=-1;
END CATCH

IF(@InAddedPersonID!=-1)
BEGIN
BEGIN TRY
   BEGIN TRAN
      INSERT Orders(Person_ID)
       VALUES(@InAddedPersonID);
   COMMIT TRAN;
   RETURN 0;
END TRY
BEGIN CATCH
  ROLLBACK TRAN;
RETURN -2
END CATCH
END

   
  
GO
16 июн 12, 14:33    [12724489]     Ответить | Цитировать Сообщить модератору
 Re: procedura Orders Persons  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
londinium,

Ваш код не менее мрачен и ужасен:
1. Зачем-то используются две транзакции, да еще и без проверки наличия охватывающей транзакции.
2. Если при вставке произошла ошибка, невозможно узнать какая именно.
3. Использование переменных, когда они нафик не нужны.

В общем, садитесь -- 2.

Ну и простенький вариант решения
declare @Persons table (person_id int identity, Name varchar(30), Surname varchar(30));
declare @Orders table (order_id int identity, person_id int);

insert into @Orders
 (person_id)
 select
  person_id
 from
  (
   insert into @Persons output inserted.person_id values('Вася', 'Пупкин')
  ) t;
  
select * from @Persons;
select * from @Orders;
:)
16 июн 12, 15:16    [12724575]     Ответить | Цитировать Сообщить модератору
 Re: procedura Orders Persons  [new]
alex212121
Member

Откуда:
Сообщений: 54
invm,

спасибо большое всем за примеры...
хотя мне нужен был вариант с процедурой и использованием столов персонс и ордерс существующих.
так чтобы всеголишь надо было бы набрать exec @name=alex @surname=popov @personID=1
и произошёл бы инсерт в персонс от куда автоматически взялся бы персондИДЕ и интертировался в ордерс
17 июн 12, 00:32    [12725941]     Ответить | Цитировать Сообщить модератору
 Re: procedura Orders Persons  [new]
гугль мугль
Guest
alex212121,

"mssql как узнать последний вставленный id"

google
18 июн 12, 09:41    [12728800]     Ответить | Цитировать Сообщить модератору
 Re: procedura Orders Persons  [new]
alex212121
Member

Откуда:
Сообщений: 54
гугль мугль,

SELECT LAST(column_name) FROM table_name

Таблица

O_Id OrderDate OrderPrice Customer
1 2008/11/12 1000 Hansen
2 2008/10/23 1600 Nilsen
3 2008/09/02 700 Hansen
4 2008/09/03 300 Hansen
5 2008/08/30 2000 Jensen
6 2008/10/04 100 Nilsen

Пишешь

SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders

Получаешь


LastOrderPrice
100
19 июн 12, 21:58    [12741704]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить