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

时间:2018-08-31 13:21:44

标签: c# asp.net sql-server sql-server-2008 stored-procedures

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

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函数,它看起来像这样,用于匹配数据库中的记录:

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条记录(那将是灾难性的从我的眼神来看)...

有人可以帮我吗?

P.S。伙计们,我对这一想法的“最佳”想法是:

daylist参数如下:

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

And then sales:

    11,22,44,55,66,77,88

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

我可以在C#应用程序中形成键-值对字典字符串,例如:

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

这是我形成字符串的方式。但是然后我需要在MSSQL中分解此字符串以匹配=>第1天=>用销售44更新...

1 个答案:

答案 0 :(得分:2)

您可以创建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);