2008-12-15 3 views
0

Ниже приведена моя хранимая процедура. Я хочу использовать хранимую процедуру, чтобы выбрать всю строку даты из tbl_member и вставить 2 таблицы. Но это не работает. Кто-нибудь может мне помочь?Сохраненная процедура, вы можете мне помочь?

Create PROCEDURE sp_test 
AS 
BEGIN 
    SET NOCOUNT ON; 

    Declare @A Varchar(255), @B Varchar(255), @C Varchar(255), @D int 

    Declare Table_Cursor Cursor 
    For select A, B, C from tbl_Member Open Table_Cursor 
     Fetch Next From Table_Cursor 
     Into @A, @B, @C While(@@Fetch_Status=0) 

    Begin Exec(
     'insert into NewMember (A, B, C, D) values (@A, @B, @C, @D) 
     set @D = @@IDENTITY 
     Insert into MemberId (Mid) VALUES(@D) 
    ) 
    Fetch Next From Table_Cursor Into @A, @B, @C End Close Table_Cursor 
    Deallocate Table_Cursor 
END 
GO 
+0

У вас есть «до» вставки », а не после. – 2008-12-15 09:36:02

ответ

8

Первое, что я вижу здесь, это то, что вы используете курсор, когда вам это не нужно. Вы можете переписать первый запрос, как:

INSERT INTO NewMember(A, B, C, D) 
SELECT A, B, C, D 
FROM tbl_member 

Тогда, я бы триггер INSERT против NewMember, который вставляется в столбец идентификаторов.

create trigger myInsertTrigger 
on newmember 
for insert 
as 
insert into memberid(mid) 
select <<identity_column>> from inserted 

BTW - это плохая идея использовать @@ IDENTITY, чтобы получить личность вставки. Вместо этого используйте функцию SCOPE_IDENTITY.

3

Пожалуйста, обратите особое внимание на то, что сказал Пит о @@. Причина, по которой плохо когда-либо использовать @ @ identity, заключается в том, что если триггер когда-либо добавляется в таблицу, которая вставляет в другую таблицу с идентификатором, это тождество, которое возвращается не тот, который вы только что вставили. Это может привести к серьезным проблемам с целостностью данных, которые могут не возникать в течение нескольких месяцев.

Даже если вы сохранили курсор (который я не рекомендую, курсоры - очень плохой способ делать вставки, поскольку они очень медленны по сравнению с установленным решением, которое дал Пит), ваш код не мог сделать вставку к первой таблице, если столбец D является столбцом идентичности (который, как я предполагал, будет с тех пор, как вы позже попытаетесь присвоить значение идентификатора D). Это потому, что вы пытаетесь поместить значение в столбец, который не может принять значение по мере его автогенерации. Если D - тождество, то не используйте его во вставке вообще, просто определите столбцы, которые вам нужно вставить. Это было бы справедливо и для решения Пита, если D фактически является вашей личностью.

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