在SQLServer2005中获取for循环中每行的主键
我想在SQLServer2005中编写一个触发器,在该触发器中,在for循环中,我想根据特定表的主键更新该表的每一行。问题是如何获取for循环中每行的主键 请帮忙在SQLServer2005中获取for循环中每行的主键,sql,database,sql-server-2005,triggers,primary-key,Sql,Database,Sql Server 2005,Triggers,Primary Key,我想在SQLServer2005中编写一个触发器,在该触发器中,在for循环中,我想根据特定表的主键更新该表的每一行。问题是如何获取for循环中每行的主键 请帮忙 很抱歉没有提及上述细节 Table UserPersonalInfo UserId varchar(50) Primary Key FirstName varchar(50) MiddleName varchar(50)
很抱歉没有提及上述细节
Table UserPersonalInfo
UserId varchar(50) Primary Key
FirstName varchar(50)
MiddleName varchar(50)
LastName varchar(50)
UserName varchar(50)
Password varchar(50)
ContactNo bigint
Verified bit
Address varchar(100)
EmailId varchar(100)
RoleId int
CurrentFine money
Photo image
Table CurrentlyIssuedBook
Userid varchar(50) Primary Key
BookId varchar(50)
IssuedDate datetime
ExpectedReturnDate datetime
ISBN varchar(50)
Table CurrentDate
date datetime
上面是两张桌子
现在我想做的是
每次运行C#应用程序时,我都会尝试用实际的当前日期更新CurrentDate表中的日期。如果更新成功,则触发器将运行
在触发器内部,我想为UserPersonalInfo表中的每个用户更新fine。为此,我考虑过使用循环,但如何从UserInfo表中获取每行的主键值呢
我精细的计算逻辑如下
totalfine = 0
x = currentdate - ExpectedReturnDate
y = x/30
z = x%30
for(int i=0; i <y; i++)
{
totalfine = totalfine + (2^i * 4 * 30);
}
totalfine = totalfine + (2^i * 4 * z);
totalfine=0
x=currentdate-ExpectedReturnDate
y=x/30
z=x%30
对于(int i=0;i不要使用循环
只需使用带有nowhere
子句的update
语句,即可更新表中的每一行,例如:
declare @currentdate datetime
select @currentdate = date from currentdate
update userinfo
set fine = case when @currentdate < getdate() then 100 else 0 end
你不能这样做吗
CREATE TRIGGER tr_CurrentDateUpdate
ON CurrentDate
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
UPDATE UserInfo
SET fine = 6
WHERE userid like '%foo%'
UPDATE UserInfo
SET fine = 7
WHERE userid like '%baa%'
END
GO
CREATE FUNCTION CalculateFine (@UserId varchar(50), @CurrentDate datetime)
RETURNS money
AS
BEGIN
--TODO get expected return date ExpectedReturnDate from CurrentlyIssuedBook for that @UserId
--TODO Do you need all these delcarations?
DECLARE @x AS INT
DECLARE @fine AS MONEY
DECLARE @y AS INT
DECLARE @z AS INT
SET @x = DATEDIFF(dd, @CurrentDate, ExpectedReturnDate)
SET @y = @x/30
SET @z = @x%30
-- TODO convert your logic here....
--Return your answer
RETURN @fine
END
其中“Where”子句是您选择要更改哪些用户的标准,罚款=您的计算
此外,我没有对此进行测试,但是,如果您在UDF中进行计算,我认为您可以将类似的内容放在我的更新语句中:
DECLARE @InsertedDate Datetime
SELECT @InsertedDate = date
FROM inserted
UPDATE u
SET u.fine = cf.FineResult
FROM UserInfo u
cross apply dbo.CalculateFine(u.UserId, @InsertedDate) cf
其中CalculateFine UDF包含关于如何将用户详细信息转换为精细信息的逻辑
对于UDF,类似以下内容:
CREATE TRIGGER tr_CurrentDateUpdate
ON CurrentDate
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
UPDATE UserInfo
SET fine = 6
WHERE userid like '%foo%'
UPDATE UserInfo
SET fine = 7
WHERE userid like '%baa%'
END
GO
CREATE FUNCTION CalculateFine (@UserId varchar(50), @CurrentDate datetime)
RETURNS money
AS
BEGIN
--TODO get expected return date ExpectedReturnDate from CurrentlyIssuedBook for that @UserId
--TODO Do you need all these delcarations?
DECLARE @x AS INT
DECLARE @fine AS MONEY
DECLARE @y AS INT
DECLARE @z AS INT
SET @x = DATEDIFF(dd, @CurrentDate, ExpectedReturnDate)
SET @y = @x/30
SET @z = @x%30
-- TODO convert your logic here....
--Return your answer
RETURN @fine
END
表的模式是什么(名称、列名和类型等)?哪一列是主键?您计划在每一行上更新什么,以及它与主键的关系如何?如果可以避免的话,不要使用循环。它要慢得多。为什么不只是像update table set something=key
?很抱歉没有提到上面的详细信息表UserInfo UserId varchar(25)主键,名称varchar(100),部门varchar(50),fine money Table CurrentDate datetime上面是两个表,现在我要做的是每次运行C#应用程序时,我都会尝试用实际的当前日期更新CurrentDate Table中的日期。如果更新成功,则触发器将运行。在触发器中,我要为UserInfo ta中的每个用户更新fineble.为此,我考虑过使用循环,但如何从UserInfo表中获取每一行的主键值?@NileshBarai:请不要将表的详细信息等发布到评论中-这真的很难阅读…..请通过编辑更新您的问题并提供新信息!@NileshBarai下次,只需编辑您的问题:我为您做的这一次。我需要做一个计算来为每个用户找到罚款。对于每个用户,罚款将是不同的。我可能误解了你的设计,但它真的需要一个触发器吗?你不能在SP中插入当前日期的update语句吗?@RichardHanley:等等,我将发布整个所需的架构,用于e以上problem@Blorgbeard:我已修改了我的问题。请建议我是否可以在单个更新查询中进行我提到的计算?正如您之前所问的,我已修改了我的问题如何为每个用户执行此操作?当您更新currentdate表并更新UserInfo表中的所有行时,将触发此操作。如果您需要通过“插入”你也可以将日期值添加到你的UDF计算中。但我想这会用一个我不想要的精细值更新所有用户记录。我在问题中给出了我的精细计算逻辑。看一看,你可以提出一些建议将你的计算逻辑放入UDF中,让它计算精细值。像我在中所做的那样调用UDF我的回答的后半部分(我认为应该可以)传递了计算所需的参数。