Хранимая процедура, вы можете мне помочь? - PullRequest
0 голосов
/ 15 декабря 2008

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

Ответы [ 2 ]

8 голосов
/ 15 декабря 2008

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

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.

3 голосов
/ 15 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...