如何使用太多参数简化批量SQL插入

时间:2017-04-21 18:33:17

标签: c# sql csv stored-procedures insert

所以我试图插入看起来像这样的数据:

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

这通常非常简单和线性,因为所有插入一个接一个地发生并且表现良好(我认为)。

问题是我允许使用的SQL参数数量存在硬限制 - 2100。 上限边缘情况考虑了一个比它高出一点的插入。

我正在考虑将WorkgroupId和SmartFeedPriority的数据作为csvs传递,并使用split函数创建表格或类似的东西......

处理这类数据的最佳方法是什么?

也许创建一个存储过程,传递@ UserId,@ WorkgroupId(CSV)和@SmartFeedPriority(CSV)并以这种方式逐个插入线性,但是我不太清楚这个逻辑将如何看...

1 个答案:

答案 0 :(得分: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