您好 我有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次。这是多变的。
答案 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将值列表作为单个参数传递。
答案 3 :(得分:-1)
而不是难以维护且不可扩展的花哨的SQL代码,我只是多次调用您的存储过程。
如果性能或事务行为是个问题,您可以考虑在一个批处理中发送命令。
你谈到了5个插入。如果要插入的记录数量要大得多,您也可以考虑批量插入。