Ниже моя хранимая процедура. Я хочу использовать хранимую процедуру, выбрать всю строку даты из 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
Вы обязательно должны научиться правильно делать отступы в своем коде. Очень сложно увидеть, что здесь есть цикл while, потому что вы спрятали и while, и конец в середине строки между другими операторами.


Первое, что я здесь вижу, это то, что вы используете курсор, когда он вам не нужен. Вы можете переписать первый запрос как:
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
Кстати, использовать @@ IDENTITY для идентификации вставки - плохая идея. Вместо этого используйте функцию SCOPE_IDENTITY.
Обратите особое внимание на то, что Пит сказал о @@ identity. Причина, по которой когда-либо использовать @@ identity плохо, заключается в том, что если триггер когда-либо добавляется в таблицу, которая вставляется в другую таблицу с идентификатором, это идентификатор, который возвращается, а не тот, который вы только что вставили. Это может привести к серьезным проблемам с целостностью данных, с которыми можно не бороться в течение нескольких месяцев.
Даже если вы сохранили курсор (что я не рекомендую, курсоры - очень плохой способ делать вставки, поскольку они очень медленные по сравнению с решением на основе наборов, которое дал Пит), ваш код не может выполнить вставку в первую таблицу если столбец D является столбцом идентификатора (что, как я предполагаю, так как вы позже попытаетесь присвоить D значению идентификатора). Это потому, что вы пытаетесь поместить значение в столбец, который не может принимать значение, поскольку оно создается автоматически. Если D является идентификатором, то вообще не используйте его во вставке, просто определите столбцы, в которые нужно вставить. То же самое можно сказать и о решении Пита, если D на самом деле является вашим столбцом идентичности.
У вас есть "вставка" перед ", а не после".