Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLServer2005中获取for循环中每行的主键_Sql_Database_Sql Server 2005_Triggers_Primary Key - Fatal编程技术网

在SQLServer2005中获取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)

我想在SQLServer2005中编写一个触发器,在该触发器中,在for循环中,我想根据特定表的主键更新该表的每一行。问题是如何获取for循环中每行的主键

请帮忙


很抱歉没有提及上述细节

  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不要使用循环

只需使用带有no
where
子句的
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我的回答的后半部分(我认为应该可以)传递了计算所需的参数。