MSSQL обновляет сразу несколько записей одной хранимой процедурой - PullRequest
0 голосов
/ 31 августа 2018

У меня есть хранимая процедура, которая в настоящее время выглядит следующим образом:

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

Так я могу передать параметры продаж и дней ... Но что тогда? Я не могу знать, какая распродажа соответствует какому дню ...

Я мог бы сформировать строку словарь-пара ключей в моем приложении на C #, например:

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

это то, как я мог сформировать строку .. Но тогда мне нужно разбить эту строку в MSSQL, чтобы соответствовать => день 1 => обновить с продажами 44 ...

1 Ответ

0 голосов
/ 31 августа 2018

Вы можете создать тип 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);
...