c# - 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
我的 SearchedUserGraphData 表中有两列和 7 条记录(7 天)应该更新。例如:
Day Sales
0 5
1 6
2 4
3 3
4 7
5 9
6 11
我通过传递天数列表“部分”解决了这个问题......但我无法找出如何将这个 @DayList 参数与销售数据配对......
我创建了一个 SplitString 函数,它看起来像这样用于匹配 DB 中的记录:
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# 应用程序组合的 Days 列表及其相应的销售额中传递,然后一次更新所有记录,而不调用该过程 7 次来更新 7 条记录(从性能的角度来看这将是灾难性的在我眼里)...
有人可以帮我解决这个问题吗?
PS 伙计们,我对此的“最佳”想法是:
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 中分解这个字符串以匹配 => day 1 => update with sales 44 ...
解决方案
您可以创建一个 SalesPerDay 类型
CREATE TYPE [dbo].[SalesPerDay] AS TABLE (
day INT NOT NULL,
sales INT NOT NULL
);
然后,你的 proc 看起来像这样
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);
推荐阅读
- html - 如何使用 :hover 制作这种滚动效果?
- html - DT::datatable 无法解析单元格中的 HTML 元素
- here-api - 我可以在付费帐户中使用地理围栏吗,我在将地理围栏上传到服务器时遇到问题
- amazon-web-services - 如何在 AWS elasticbeanstalk 上部署 symfony 3 项目
- javascript - 如何切片 main swagger.js 并将它们包含回来?
- gitlab-ci - Gitlab-CI 镜像和服务
- r - 如何更改ggplot中graphique的格式以结合geom_col和geom_surface
- bash - 将 PS 命令结果中的 PID 存储到数组中
- python - 如何删除所有这些“错误”布尔值
- c# - 为什么 Triangle.Net 没有按预期对这些多边形进行三角剖分?