Хранимая процедура, вы можете мне помочь?

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

У вас есть "вставка" перед ", а не после".

Filip Ekberg 15.12.2008 12:36

Вы обязательно должны научиться правильно делать отступы в своем коде. Очень сложно увидеть, что здесь есть цикл while, потому что вы спрятали и while, и конец в середине строки между другими операторами.

James Z 24.08.2015 18:41
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
195
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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 на самом деле является вашим столбцом идентичности.

Другие вопросы по теме