从数据层多次插入值到存储过程的最佳方法?

时间:2011-02-16 20:21:08

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

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

E.g: -

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

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

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

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

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

4 个答案:

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

答案 1 :(得分:0)

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

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

然后运行它: -

EXEC @return_value = [dbo]。[DataInsert]         @DataName = N'five,bits,of,your,data'

来自table01的

* 行:*

5

数据

(5行(s)受影响)

答案 2 :(得分:-1)

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

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

答案 3 :(得分:-1)

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

如果性能或事务行为是个问题,您可以考虑在一个批处理中发送命令。

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