Как составить запрос на обновление двух таблиц одновременно? - PullRequest
1 голос
/ 01 марта 2012

Привет, у меня есть две таблицы в моей базе данных с именем ... Отслеживание запросов и баланса, которое не имеет никакого отношения .... но я хочу выбрать данные из двух таблиц и поместить их в две сетки ...

               Requests   
          EmpID   |EmpRqsts|EmpDescription|ApproverID|ApprovedAmount|RequestPriority
           1      |asdfsb  |sadbfsbdf     |1         |
           2      |asbfd   |sjkfbsd       |1         |

          Balance Tracker
          EmpId|BalanceAmnt|LastUpdated|lastApprovedAmount
         | 1   |5000       |sdfbk      |
         | 2   |3000       |sjbfsh     |

теперь я хочу обновлять данные на основе двух таблиц EmpID за раз ... когда будет утверждена любая сумма, она должна обновляться в столбце таблицы запросов [ApprovedAmount] и с приоритетом ... при обновлении [ApprovedAmount] [BalanceAmnt] Отслеживание баланса также необходимо обновить, добавив утвержденную сумму, [LastUpdated], [lastApprovedAmount] следует обновить с указанием даты и времени

Может ли кто-нибудь помочь мне с запросом, пожалуйста ....

Ответы [ 2 ]

1 голос
/ 01 марта 2012

@ Anil, вот пример кода SQL Server 2008, который поможет вам достичь цели:

DECLARE @Requests TABLE
(
    EmpId int 
    , EmpRqsts nvarchar(50)
    , EmpDescription nvarchar(250)
    , ApproverID int
    , ApprovedAmount money 
    , RequestPriority int 
)

DECLARE @BalanceTracker TABLE
(
    EmpId int 
    , BalanceAmnt money 
    , LastUpdated datetime
    , lastApprovedAmount money
)

-- Insert data for testing
INSERT INTO @Requests VALUES
(
    1
    , 'Something here'
    , 'Some descriptio here'
    , 1
    , 100
    , 1
)

INSERT INTO @Requests VALUES
(
    2
    , 'Something here 2 '
    , 'Some descriptio here 3'
    , 1
    , 215
    , 2
)


INSERT INTO @BalanceTracker VALUES
(
    1
    , 5000
    , GETDATE() - 3
    , 310
)

INSERT INTO @BalanceTracker VALUES
(
    2
    , 3000
    , (GETDATE() - 1)
    , 98
)

-- Declare local variables
DECLARE
    @NewAmount money
    , @NewPriority int
    , @SelectedEmpId int

-- Assing values for example
SELECT @NewAmount = 1000
    , @SelectedEmpId = 1
    , @NewPriority = 5

-- Get the tables values pre - updates
SELECT  *
FROM    @Requests

SELECT  *
FROM    @BalanceTracker


BEGIN TRY

    -- Update the record with new ApprovedAmount and Request Priority
    UPDATE  @Requests
    SET ApprovedAmount = @NewAmount
        , RequestPriority = @NewPriority
    WHERE   EmpId = @SelectedEmpId

    -- If no error found then update BalanceAmnt trable
    IF (@@ERROR = 0)
    BEGIN TRY
        UPDATE  @BalanceTracker
        SET BalanceAmnt = (BalanceAmnt + @NewAmount)
            , LastUpdated = GETDATE()
            , lastApprovedAmount = @NewAmount
        WHERE   EmpId = @SelectedEmpId
    END TRY
    BEGIN CATCH
    PRINT N'Error found updating @BalanceTracker table: ' + ISNULL(LTRIM(STR(ERROR_NUMBER())) , N'Unknown Error' )
        + N', Message: ' + ISNULL ( ERROR_MESSAGE() , N'No Message' )
    END CATCH
END TRY
BEGIN CATCH
    PRINT N'Error found updating @Requests table: ' + ISNULL(LTRIM(STR(ERROR_NUMBER())) , N'Unknown Error' )
        + N', Message: ' + ISNULL ( ERROR_MESSAGE() , N'No Message' )
END CATCH

-- Get the tables values post - updates
SELECT  *
FROM    @Requests

SELECT  *
FROM    @BalanceTracker

Примечание 1 : @Table - это таблицы переменных, обрабатываемыеSQL Server 2008. Если вы используете предыдущую версию, вы сможете создать временную таблицу (#Table). Примечание 2 : типы данных могут различаться в зависимости от используемой версии SQL.

0 голосов
/ 01 марта 2012

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

...