[英]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.