Вставить данные из датируемой и объявленной переменной в таблицу с помощью хранимой процедуры - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь вставить asp.net данные сетки в таблицу базы данных [DBO].[tbl_family_member].Для этого я создал тип typ_fam_mem.Но проблема в том, что значение столбца family_member_id генерируется из другой таблицы [DBO].[TBL_FAMILY_HEAD].Пожалуйста, посмотрите на процедуру.

Как вставить данные в таблицу из переменных данных и процедурных переменных?

CREATE TABLE [DBO].[tbl_family_member] 
(
    family_member_id bigint identity(1,1) not null,
    family_head_id bigint NOT NULL,
    mem_name nvarchar(200) not null,
    mem_gender tinyint not null,
    mem_occupation nvarchar(50),
    mem_maritial_status tinyint,
    STATUS INT NOT NULL DEFAULT '1',

    CONSTRAINT pk_family_member PRIMARY KEY (family_member_id)
)

create type typ_fam_mem as table
(   
    mem_name nvarchar(200) not null,
    mem_gender tinyint not null,
    mem_occupation nvarchar(50),
    mem_maritial_status tinyint
)

Хранимая процедура

CREATE PROCEDURE [dbo].[P_SET_PROFILE_REGISTRATION] 
    (
     --- FOR FAMILY HEAD TABLE
     @P_NAME NVARCHAR(200),
     @P_GENDER TINYINT,
     ---- FOR FAMILY MEMBER
     @P_FAMILY_DT DBO.typ_fam_mem READONLY,
     @V_OUT TINYINT OUTPUT
    )
AS
    DECLARE @FAMILY_HEAD_ID BIGINT;
BEGIN
    SET NOCOUNT ON;

    BEGIN TRY
        INSERT INTO [DBO].[TBL_FAMILY_HEAD] ([NAME], [GENDER])
        VALUES (@P_NAME, @P_GENDER)

        SET @FAMILY_HEAD_ID = SCOPE_IDENTITY();

        IF @@ROWCOUNT > 0
        BEGIN
            --- block for inserting data into [DBO].[tbl_family_member]
        END
    END TRY
    BEGIN CATCH
    END CATCH
END

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Вы можете использовать INSERT...SELECT, указав переменную со сгенерированным значением.В приведенном ниже примере также добавлено управление транзакциями (подходит для вставок из нескольких таблиц, если клиентское приложение не управляет транзакцией) и обработка ошибок.

CREATE PROCEDURE [dbo].[P_SET_PROFILE_REGISTRATION] 
     --- FOR FAMILY HEAD TABLE
     @P_NAME NVARCHAR(200),
     @P_GENDER TINYINT,
     ---- FOR FAMILY MEMBER
     @P_FAMILY_DT DBO.typ_fam_mem READONLY,
     @V_OUT TINYINT OUTPUT
AS
DECLARE @FAMILY_HEAD_ID BIGINT;
SET NOCOUNT ON;
SET XACT_ABORT ON;

BEGIN TRY

    BEGIN TRAN;

    INSERT INTO [DBO].[TBL_FAMILY_HEAD] ([NAME], [GENDER])
    VALUES (@P_NAME, @P_GENDER)

    SET @FAMILY_HEAD_ID = SCOPE_IDENTITY();

    INSERT INTO dbo.tbl_family_member(
              mem_name
            , mem_gender
            , mem_occupation
            , mem_maritial_status
            , family_head_id
        )
    SELECT 
              mem_name
            , mem_gender
            , mem_occupation
            , mem_maritial_status
            , @FAMILY_HEAD_ID
    FROM @P_FAMILY_DT;

    COMMIT;

END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK;
    THROW;
END CATCH;
GO
0 голосов
/ 20 мая 2018

@P_FAMILY_DT - это table type, вы можете запросить тип таблицы как обычный table.Ваша вставка должна выглядеть как

INSERT INTO [DBO].[tbl_family_member] 
            (family_head_id, 
             mem_name, 
             mem_gender, 
             mem_occupationm, 
             mem_maritial_status) 
SELECT @FAMILY_HEAD_ID, 
       mem_name, 
       mem_gender, 
       mem_occupation, 
       mem_maritial_status 
FROM   @P_FAMILY_DT 
...