0

我有两张桌子:

第一个是Requisitions(父表):

RequisitionId          int     // primary key
RequisitionNumber      varchar(20)
RequisitionBy          varchar(100)
Remarks                varchar(300)
ApprovedStatus         varchar(20)

另一个是RequisitionDetails(子表):

RequisitionDetailId    int     // primary key
RequisitionId          int     // foreign key ("Requisitions" table)
ProductId              int
UnitConversionId       int
Quantity               decimal(18, 2)

现在我想使用单个存储过程在表中插入一行并在Requisitions表中插入多行。RequisitionDetails

ROLLBACK如果事务中有任何问题,存储过程应该包含命令。我需要帮助编写这个存储过程。

我创建了存储过程以在“申请”表中插入一行,并且我拥有插入行的 RequisitionId。现在使用这个 RequisitionId 如何为 RequisitionDetails 表插入多行?

这是存储过程。我需要扩展它:

CREATE PROCEDURE dbo.InsertRequisition
(
    @RequisitionNumber varchar(20) = NULL,
    @RequisitionBy varchar(100) = NULL,
    @Remarks varchar(300) = NULL,
    @ApprovedStatus varchar(20) = NULL
)

AS

BEGIN

SET NOCOUNT ON;

    DECLARE @requisitionId INT;

    INSERT INTO [Requisitions] 
    (
        [RequisitionNumber],
        [RequisitionBy],
        [Remarks],
        [ApprovedStatus]
    )

    VALUES
    ( 
        @RequisitionNumber,
    @RequisitionBy,
        @Remarks,
        @ApprovedStatus
    )

    SET @requisitionId = SCOPE_IDENTITY();

   END
4

1 回答 1

2

如果我正确理解了问题,下面的代码应该能够解决您的问题。

第 1 步: 在数据库中创建类型

CREATE TYPE AnyNameTableType AS TABLE
(ColumnName1 INT, ColumnName2 VARCHAR(50))

第 2 步: 创建/修改您的存储过程以接受表类型

 CREATE PROCEDURE My_TestProc
 (@tvpVariableName AnyNameTableType READONLY)
 AS
 BEGIN
    SELECT * FROM @tvpVariableName;
   --You can use this variable as table anywhere you want
   --Select/Insert/Update from this table and update your RequisitionDetails
   --table.
 END;

第 3 步: 编写您的 c# 代码以传递此变量。

    DataTable table = new DataTable(); //Define your datatable simillar to TableType declared in SQL
    table.Columns.Add("ColumnName1"); //Same Column Name you should use as of TableTYpe
    table.Columns.Add("ColumnName2");
    DataRow row = table.NewRow();
    row["ColumnName1"] = 1; //Fill you datatable with data you want
    row["ColumnName2"] = "Pratik";
    table.Rows.Add(row);
    table.AcceptChanges();

    SqlConnection connection = new SqlConnection("data source=yoursource;database=test;uid=sa;pwd=yourpwd");
    SqlCommand selectCommand = new SqlCommand("My_TestProc", connection);
    selectCommand.CommandType = CommandType.StoredProcedure;
    SqlParameter tvpParam = selectCommand.Parameters.AddWithValue("@tvpVariableName", table);//Parameter Name
    tvpParam.SqlDbType = SqlDbType.Structured;  // Very Important Not to miss
    connection.Open(); //You can add multiple parameters also.
    grid.DataSource = selectCommand.ExecuteReader();
    grid.DataBind();
    connection.Close();

在此步骤之后,如果您有任何困惑,请告诉我。

于 2013-09-20T12:32:08.460 回答