Sql server 2008 如何创建一个查询以一次更新两个表?
嗨,我的数据库中有两个表,名为…Requests和Balance tracker,它们之间没有关系…但我想从两个表中选择数据,并将其绑定到两个网格中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
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表的记录。