2017-04-21 79 views
1

所以我想插入看起來像這樣的數據:如何簡化批量SQL插入了太多參數

INSERT INTO RELATIONSHIP_CONFIG (USERID, WORKGROUPID, PRIORITY) VALUES 
    (@userId, @WorkgroupId10, @SmartFeedPriority10), 
    (@userId, @WorkgroupId11, @SmartFeedPriority11), 
    (@userId, @WorkgroupId12, @SmartFeedPriority12), 
    (@userId, @WorkgroupId13, @SmartFeedPriority13); 

通常是非常簡單和線性的所有插入發生一前一後,並進行罰款(我認爲)。

問題在於我允許使用的SQL參數的數量有一個硬限制--2100。 上限邊緣案例說明了一個插入,它比上面的要高很多。

我在想通過爲WorkgroupId和SmartFeedPriority數據爲CSV並在使用拆分函數來創建表或類似的東西...

什麼,是對付這樣的數據最好的方法?

也許創建一個存儲過程,傳遞@UserId,@WorkgroupId(CSV)和@SmartFeedPriority(CSV),並以這種方式進行線性插入,但我不太確定這個邏輯是如何實現的將看起來...

+1

可以做的1000批次,然後UNION它們 –

+1

如果your're處理數以千計的刀片,你應該考慮是'SqlBulkCopy'或同步點的提交使用'SqlTransaction' – Stavr00

+0

使用表的參數在很傳遞從.net到RDBMS的大量值。 – PhillipH

回答

0

看看你的問題,這是有點難以建議一個好方法。我無法看到數據源的來源和位置。

我看到你提到了一個CSV文件。您可以使用以下腳本從CSV文件導入數據。一旦數據在表格中,您可以嘗試以下示例之一。

IF OBJECT_ID('tempdb.dbo.#TempTable', 'U') IS NOT NULL 
     DROP TABLE #TempTable ; 

    CREATE TABLE #TempTable 
    (
     [UserID] NVARCHAR(MAX) NULL, 
     [WorkGroup] NVARCHAR(MAX) NULL, 
     [SmartFeedPriority] NVARCHAR(MAX) NULL, 
    ) 

    BULK INSERT #TempTable 
    FROM ' put your csv file path here ' 
    WITH 
    (
    FIELDTERMINATOR = ',', -- comma delimited 
    ROWTERMINATOR = '\n', 
    CODEPAGE = 65001 --'65001' 
    ) 

如果您試圖插入的數據來自表格,您可以嘗試將數據選擇到您需要的表格中。

例子:

SELECT [UserID], [WorkgroupID], [SmartFeedPriority] 
INTO [dbo].[RELATIONSHIP_CONFIG] 
FROM [dbo].[SorceTable] 

如果你想利用程序路線,你可以試試下面的。如果您的數據來源位於表格中,並且您希望單獨插入每條記錄,則下面的示例將起作用。

實施例:

程序插入

CREATE PROCEDURE [dbo].[CREATE_RELATIONSHIP_CONFIG](@UserId INT, @WorkgroupId INT, @SmartFeedPriority INT) 
AS 
BEGIN 
    INSERT INTO RELATIONSHIP_CONFIG (UserId, WorkgroupId, Priority) VALUES 
(@userId, @WorkgroupId, @SmartFeedPriority) 
END 

可以在while循環包裹上面的過程。 我在下面爲它添加了一個示例。

declare @UserId int; 
declare @WorkgroupId int; 
declare @Priority int; 
WHILE EXISTS (SELECT [UserID] FROM #TempTable) 
    BEGIN 
     SELECT TOP 1 @UserId=[UserID], @WorkgroupId=[WorkGroup] , @Priority=[SmartFeedPriority] FROM #TempTable 

     EXEC [dbo].[CREATE_RELATIONSHIP_CONFIG] @UserId, @WorkgroupId, @Priority 

     DELETE TOP (1)FROM #TempTable 
    END