Sql server 2008 如何创建一个查询以一次更新两个表?

Sql server 2008 如何创建一个查询以一次更新两个表?,sql-server-2008,c#-4.0,Sql Server 2008,C# 4.0,嗨,我的数据库中有两个表,名为…Requests和Balance tracker,它们之间没有关系…但我想从两个表中选择数据,并将其绑定到两个网格中 Requests EmpID |EmpRqsts|EmpDescription|ApproverID|ApprovedAmount|RequestPriority 1 |asdfsb |sadbfsbdf |1 |

嗨,我的数据库中有两个表,名为…Requests和Balance tracker,它们之间没有关系…但我想从两个表中选择数据,并将其绑定到两个网格中

               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]的余额跟踪器也应通过添加批准的金额进行更新,[LastUpdate],[lastApprovedAmount]应更新日期和时间


有人能帮我查询一下吗……

你可以用触发器来做这类事情。这样,每当您执行第一次更新时,它都会自动执行您指定的其他更新

你可以用触发器来做这类事情。这样,每当您执行第一次更新时,它都会自动执行您指定的其他更新

@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处理的变量表。如果您使用的是以前的版本,您应该能够创建临时表。
注2:根据您使用的SQL版本,数据类型可能会有所不同。

@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处理的变量表。如果您使用的是以前的版本,您应该能够创建临时表。
注2:数据类型可能因您使用的SQL版本而异。

看起来您的两个表在empID列上确实有关系。请澄清。还有,和binf it two grid是什么意思?请澄清你的帖子,因为它有相反的说法:Requests和Balance tracker没有关系。不确定的是,你的两个表在empID列上有关系。请澄清。还有,和binf it two grid是什么意思?请澄清你的帖子,因为它有相反的陈述:请求和平衡跟踪器没有关系。你能帮我如何使用触发器吗…@jroycan你能帮我如何使用触发器吗@jroyce@Anil,Ps:我盲目地相信你想要做什么,没有设计方面的问题。我的假设是EmpID是一个FK,链接来自请求和BalanceTracker表的记录。@Anil,Ps:我盲目地相信你想要做什么,而没有设计角度的问题。我的假设是EmpID是一个FK,用于链接来自请求和BalanceTracker表的记录。