2011-02-16 89 views
0

嗨 我有DAL层,从哪里调用存储过程插入值到表中。从数据层到存储过程多次插入值的最佳方法?

E.g.:-

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

现在,作为要求改变时,每个客户端的请求我必须添加的值的5倍。那么最佳做法是什么?

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

通过所有的值(可能是用逗号隔开)一气呵成为StoredProcedure,然后让存储过程添加它的5倍?

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

+0

传递(例如,VARCHAR(MAX))的值作为CSV列表到存储过程中,把值到一个表的变量,则插入-从表中选择可变 – CarneyCode 2011-02-16 20:29:39

回答

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)[email protected]) 
     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,位,的,你的,数据”

*从table01 行:*

数据

(5受影响行(S))

+0

感谢的人。为什么-1?它的工作对我来说 – User13839404 2011-02-23 20:12:17

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

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

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

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

相关问题