簡體   English   中英

通過存儲的proc插入多個sql行

[英]Insert multiple sql rows via stored proc

我看了一些相關主題,但我的問題尚未完全得到回答:

在Web應用程序后面的代碼中運行存儲過程時,我有以下類型的設置。 問題是我現在面臨插入多個產品的可能性,我想在一個ExecuteNonQuery完成所有操作,而不是執行一次foreach loop並運行n次。

我不確定如何使用當前設置執行此操作,或者是否可以執行此操作。

該代碼應該可以自我解釋,但是如果需要澄清,請告訴我。 謝謝。

SqlDatabase database = new SqlDatabase(transMangr.ConnectionString);
DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "proc_name", useStoredProc);

database.AddInParameter(commandWrapper, "@ProductID", DbType.Int32, entity._productID);
database.AddInParameter(commandWrapper, "@ProductDesc", DbType.String, entity._desc);
...more parameters...


Utility.ExecuteNonQuery(transMangr, commandWrapper);

PROC

ALTER PROCEDURE [dbo].[Products_Insert]
-- Add the parameters for the stored procedure here
         @ProductID int,
         @Link      varchar(max)
         @ProductDesc          varchar(max)
         @Date          DateTime
    AS BEGIN

SET NOCOUNT ON;


INSERT INTO [dbo].[Prodcuts]
    ( 
        [CategoryID],
        [Link],
        [Desc],
        [Date]
    )
VALUES
    (
        @ProductID,
        @Link,
        @ProductDesc,
        @Date
    )

結束

您應該可以循環運行存儲過程。 只要確保您很少提交,而不是在每次插入之后就提交。

對於替代方法,您已經找到了有關加載數據的討論。

就個人而言,我喜歡將SQL批量插入形式insert into myTable (select *, literalValue from someOtherTable); 但這可能不適用於您的情況。

您可以將所有數據作為表值參數傳遞-MSDN 在此處對此進行了很好的撰寫

遵循以下內容的東西應該起作用

CREATE TABLE dbo.tSegments (

SegmentID BIGINT NOT NULL CONSTRAINT pkSegment PRIMARY KEY CLUSTERED,
SegCount BIGINT NOT NULL

);

CREATE TYPE dbo.SegmentTableType AS TABLE ( SegmentID BIGINT NOT NULL );

CREATE PROCEDURE dbo.sp_addSegments

  @Segments dbo.SegmentTableType READONLY

AS

BEGIN MERGE INTO dbo.tSegments AS tSeg

USING @Segments AS S
ON tSeg.SegmentID = S.SegmentID
WHEN MATCHED THEN UPDATE SET T.SegCount = T.SegCount + 1
WHEN NOT MATCHED THEN INSERT VALUES(tSeg.SegmentID, 1);

結束

在循環外部定義命令的commandWrapper和參數,然后在循環中分配參數值並執行proc。

SqlDatabase database = new SqlDatabase(transMangr.ConnectionString);
DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "proc_name", useStoredProc);

database.AddInParameter(commandWrapper, "@ProductID", DbType.Int32 );
database.AddInParameter(commandWrapper, "@ProductDesc", DbType.String);
...more parameters...

foreach (var entity in entitties)
{
    database.SetParameterValue(commandWrapper, "@ProductID",entity._productID);
    database.SetParameterValue(commandWrapper, "@ProductDesc",entity._desc);
    //..more parameters...
    Utility.ExecuteNonQuery(transMangr, commandWrapper);
}

從純粹的工作方式來看並不理想,但是有時會受到框架和庫的限制,您被迫以某種方式調用存儲過程,以某種方式綁定參數,並且連接由池管理。您的框架。

在這種情況下,我們發現一種有效的方法是簡單地編寫帶有很多參數的存儲過程,通常是一個名稱,后跟一個數字,例如@ ProductId1,@ ProductDesc1,@ ProductId2,@ ProductDesc2,直到您決定的數字,可能會說32。

您可以使用某種形式的腳本語言來為此生成代碼。

您可以獲取存儲過程,以首先將所有值插入允許空值的表參數中,然后以類似於Johnv2020答案的方式對該數據進行批量插入/合並。 您可以先刪除空行。

它通常比一次執行效率更高(部分是由於數據庫操作本身,部分是由於框架在使連接調用過程所需的開銷等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM