如何使用单个存储过程SQL Server 2008在子表中插入单行和在子表中插入多行?

时间:2013-09-20 08:30:35

标签: sql-server-2008 stored-procedures

我有两张桌子:

第一个是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

1 个答案:

答案 0 :(得分:1)

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

第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();

如果您有任何疑惑,请执行此步骤后告诉我。