как рассчитать столбец для другой таблицы - PullRequest
0 голосов
/ 13 апреля 2019

Я хочу сделать столбец Customers_Balance для TBL_CUSTOMERS, чтобы он отображал по умолчанию результат этих хранимых процедур ....

TBL_CUSTOMERS, в котором есть информация о клиенте, и он создан таким образом

CREATE TABLE TBL_CUSTOMERS
(
    Customers_ID int PRIMARY KEY, 
    Customers_Name varchar(100) NOT NULL,
    Customers_Phone varchar(100),
    Customers_Address varchar(100),
    Customers_Web varchar(100),
    Customers_Balance decimal(16,0) not null,
);

TBL_CUSTOMERS_DETAILS, в котором есть детали всех транзакций клиента, и он создан таким образом

CREATE TABLE TBL_CUSTOMERS_DETAILS
(
    Customers_Details_ID int PRIMARY KEY,
    Customers_ID int,
    Customers_Details_Tybe varchar(50) not null,
    Customers_Details_Date date not null,
    Customers_Details_Amount decimal(16,0) not null,
);

Я создал хранимые процедуры для вычисления результата суммы баланса транзакций клиента и работал нормально, и он создан таким образом

CREATE PROC SP_SUM_CUSTOMERS_DETAILS_AMOUNT

@ID INT

AS

SELECT SUM(Customers_Details_Amount)

FROM TBL_CUSTOMERS_DETAILS

Where Customers_ID = @ID

ТЕПЕРЬ

Я хочу сделать столбец Customers_Balance для TBL_CUSTOMERS, чтобы по умолчанию показывать результат этих хранимых процедур ....

как я могу сделать что-то подобное ??

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Вы ищете Вычисляемый столбец

Вам нужно создать скалярную функцию, а не хранимую процедуру (просто измените текущую хранимую процедуру на скалярную функцию), а затем используйте эту функцию в вычисляемом столбце.Это даст вам автоматически обновленные результаты для вашего вычисляемого столбца.

Итак, переделка вашей работы должна выглядеть примерно так:

-- CREATE THE SCALAR FUNCTION FIRST 
CREATE FUNCTION SUM_CUSTOMERS_DETAILS_AMOUNT (@ID INT)
RETURNS INT 
AS
BEGIN

    RETURN (
        SELECT SUM(Customers_Details_Amount)
        FROM TBL_CUSTOMERS_DETAILS
        WHERE Customers_ID = @ID
    )

END
GO

-- NOW DROP THE CURRENT Customers_Balance COLUMN  
ALTER TABLE TBL_CUSTOMERS
DROP COLUMN Customers_Balance
GO
-- CREATE THE COMPUTED COLUMN WITH THE FUNCTION 
ALTER TABLE TBL_CUSTOMERS
ADD Customers_Balance AS dbo.SUM_CUSTOMERS_DETAILS_AMOUNT (Customers_ID)
GO
1 голос
/ 13 апреля 2019

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

Так что лучше всего перетащить столбец Customers_Balance в TBL_CUSTOMERS и процедуру, а затем создать представление, которое включает в себя данные клиента и их баланс. Вы можете сделать это путем объединения и агрегирования.

ALTER TABLE TBL_CUSTOMERS
            DROP COLUMN Customers_Balance;

DROP PROCEDURE SP_SUM_CUSTOMERS_DETAILS_AMOUNT;

CREATE VIEW VW_CUSTOMERS
AS
SELECT C.Customers_ID,
       C.Customers_Name,
       C.Customers_Phone,
       C.Customers_Address,
       C.Customers_Web,
       sum(CD.Customers_Details_Amount) Customers_Balance
       FROM TBL_CUSTOMERS C
            INNER JOIN TBL_CUSTOMERS_DETAILS CD
                       ON CD.Customers_ID = C.Customers_ID
       GROUP BY C.Customers_ID,
                C.Customers_Name,
                C.Customers_Phone,
                C.Customers_Address,
                C.Customers_Web;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...