【问题标题】:Best way to insert values multiple times from data layer to stored procedure?从数据层多次插入值到存储过程的最佳方法?
【发布时间】:2011-06-28 15:29:31
【问题描述】:

嗨 我有 DAL 层,从那里调用存储过程将值插入表中。

例如:-

CREATE PROCEDURE [dbo].[DataInsert]
    @DataName nvarchar(64)
AS
BEGIN
    INSERT INTO 
         table01 (dataname) 
        VALUES 
    (@dataname)
END

现在随着需求的变化,每个客户请求我必须添加 5 次值。那么最佳实践是什么?

我是否从我的 DAL 中调用此存储过程 5 次?

一次性将所有值(可能是逗号分隔)传递给存储过程,然后让存储过程添加5次?

顺便说一句。它并不总是5次。它是可变的。

【问题讨论】:

  • 将值作为 csv 列表(例如 varchar(max))传递到存储过程中,将值放入表变量中,然后从表变量中插入选择

标签: asp.net performance tsql stored-procedures data-access


【解决方案1】:

您可以创建用户定义的表类型;

CREATE TYPE [dbo].[SomeInfo] AS TABLE(
[Id] [int] NOT NULL, 
[SomeValue] [int] NOT NULL )

这样定义您的存储过程;

CREATE PROCEDURE [dbo].[AddSomeStuff]
    @theStuff [SomeInfo] READONLY
AS
BEGIN
    INSERT INTO SOMETABLE ([...columns...])
    SELECT [...columns...] from @theStuff
END

然后你需要创建一个与模式匹配的数据表(下面称为表)并调用存储的过程;

var cmd = new SqlCommand("AddSomeStuff", sqlConn) {CommandType = CommandType.StoredProcedure};

var param = new SqlParameter("@theStuff", SqlDbType.Structured) {Value = table};
cmd.Parameters.Add(param);

cmd.ExecuteNonQuery();

【讨论】:

    【解决方案2】:

    顺便说一句,这个过程有效 - 我刚刚编写并测试了它,看看下面的结果!

    CREATE PROCEDURE [dbo].[DataInsert]
         @DataName nvarchar(max) AS  
    BEGIN  
    DECLARE @pos SMALLINT, @str VARCHAR(max)  
    
    WHILE @DataName <> ''  
    BEGIN  
        SET @pos = CHARINDEX(',', @DataName)  
        IF @pos>0  
            BEGIN  
                SET @str = LEFT(@DataName, @pos-1) 
                SET @DataName = RIGHT(@DataName, LEN(@DataName)-@pos)  
            END  
        ELSE  
            BEGIN  
                SET @str = @DataName 
                SET @DataName = ''  
            END  
    
       INSERT INTO table01 VALUES(CONVERT(VARCHAR(100),@str)) 
    
    END  
    END  
    GO
    

    然后运行它:-

    执行@return_value = [dbo].[DataInsert] @DataName = N'五个,位,的,你的数据'

    *table01 中的行:*

    五个

    你的

    数据

    (受影响的 5 行)

    【讨论】:

    • 很高兴你发现这个答案很有用,尽管有人反对它 - Stackoverflow 是一个很棒的网站,但不幸的是有一些用户的议程可疑......请随意投票,以便其他人可以看到它至少价值超过-1
    【解决方案3】:

    我要么重复调用你的 proc(这是我的选择),要么你可以使用 XML 将值列表作为单个参数传递。

    http://support.microsoft.com/kb/555266

    【讨论】:

      【解决方案4】:

      我会简单地多次调用您的存储过程,而不是难以维护且不可扩展的花哨的 SQL 代码。

      如果性能或事务行为有问题,您可以考虑一次性发送命令。

      您谈到了 5 次插入。如果要插入的记录数更多,您也可以考虑批量插入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 2014-03-31
        相关资源
        最近更新 更多