MSSQL 通过一个存储过程一次更新多个记录



我有一个存储过程,目前看起来像这样:

create procedure zsp_updateTyp5Graph
(
@DayList nvarchar(1000),
@Sales int,
@SearchedUserId int
)
as 
update SearchedUserGraphData
set SalesForDay=@Sales
where Day in (SELECT * FROM dbo.SplitString(@DayList)) and SearchedUserId=@SearchedUserId

daylist 参数如下所示:

0,1,2,3,4,5,6

我的搜索用户图形数据表中有两列和 7 条记录(7 天(应该更新。例如:

Day    Sales
0       5
1       6
2       4
3       3
4       7
5       9 
6      11

我已经通过日期列表"部分"解决了这个问题......但是我无法找到如何将此@DayList参数与销售数据配对...

我创建了一个 SplitString 函数,看起来像这样用于匹配数据库中的记录:

ALTER FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos  = CHARINDEX(',', @stringToSplit)  
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList 
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END

现在的问题是我需要以某种方式从我的 C# 应用程序组合的天数列表及其相应的销售额中传递,然后一次更新所有记录,而无需调用该过程 7 次来更新 7 条记录(从性能的角度来看,这将是灾难性的在我看来(...

有人可以帮助我解决这个问题吗?

附言伙计们,我得到的"最好"想法是:

daylist 参数如下所示:

0,1,2,3,4,5,6
And then sales:
11,22,44,55,66,77,88

这是我传递销售和天数参数的方式......但那又如何?我不知道哪一天的销售对应...

我可以在我的 C# 应用程序中形成一个键值对字典字符串,如下所示:

{ Day: 1 Sales: 44, Day: 2 Sales: 55 } 

这就是我如何形成字符串..但是然后我需要在 MSSQL 中分解这个字符串以匹配 => 第 1 天 => 更新与销售 44 ...

您可以创建 SalesPerDay 类型

CREATE TYPE [dbo].[SalesPerDay] AS TABLE (
day INT NOT NULL,
sales INT NOT NULL
);

然后,您的进程将如下所示

create procedure zsp_updateTyp5Graph
(
@DayList SalesPerDay READONLY,
@SearchedUserId int
)
as 
update SearchedUserGraphData
set SalesForDay=dayList.sales
FROM SearchedUserGraphData baseTable
INNER JOIN @DayList dayList ON dayList.day = baseTable.day
WHERE SearchedUserId=@SearchedUserId

从 C# 中,您可以构建一个DataTable并将其发送到 proc。

var table = new DataTable();
table.Columns.Add("day", typeof(int));
table.Columns.Add("sales", typeof(int));
//Add data
table.Rows.Add(new []{1, 200});
table.Rows.Add(new []{2, 200});
//More code
Command.Parameters.AddWithValue("@DayList", table);

最新更新