2012-02-13 12 views
-3

SQL Server 2005でforループの内部で主キーに基づいて特定のテーブルのすべての行を更新するトリガーを作成したいとします。問題は、どのようにループ内の各行の主キーを取得する必要がありますか?SQL Server 2005で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 

の上の上言及していないために残念

2つのテーブル

です助けてください今私が何をしようとしています何です...

毎回I実行私のC#アプリケーション私は実際の現在の日付CurrentDateテーブルの日付を更新しようとします。更新が成功すると、トリガーが実行されます。

トリガーの中で、私はUserPersonalInfoテーブル内の各ユーザーに対して正常に更新したいと思います。そのために私はループを使用することを考えましたが、どのように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); 

を次のでしょうか?

+3

テーブルのスキーマが(名前、列名とタイプ、など)は何ですか?どの列が主キーですか?各行で正確に何を更新する予定ですか?それは主キーにどのように関連していますか? –

+1

ループを避けることはできません。それはずっと遅いです。なぜ、 'update table set something = key'のようなものではないのですか?上記言及していないため申し訳ありません – Blorgbeard

+0

は 表のUserInfo ユーザID VARCHAR(25)主キー、 名前はvarchar(100)、 DEPTのVARCHAR(50)、 細かいお金 表CURRENTDATE 日付日時 上記されている詳細2つのテーブル 今私がやろうとしているのは 私はCurrentDateテーブルの日付を実際の現在の日付で更新しようとします。更新が成功すると、トリガーが実行されます。 トリガーの内側で、私はUserInfoテーブルの各ユーザーのために正常に更新したいです。そのために私はループを使用することを考えましたが、どのようにUserInfoテーブルから各行の主キー値を取得するのですか? –

答えて

2

ループを使用しないでください。あなただけの無where句、例えばとupdateステートメントを使用して、テーブルのすべての行を更新することができます

:もちろん

declare @currentdate datetime 
select @currentdate = date from currentdate 

update userinfo 
set fine = case when @currentdate < getdate() then 100 else 0 end 

、私はあなたの細かい計算があるかわからないので、上記のですほんの一例です

上記のように他のテーブルなどを含む複雑な計算を更新ステートメントに入れることができます。これはループよりもはるかに高速です。あなたが実際にループを使いたい場合は、カーソルを使用する必要があります。多分何かのように:

declare @ID int 
declare cur_loop cursor fast_forward for 
    select UserId from UserInfo 

open cur_loop 
fetch next from cur_loop into @ID 
while @@FETCH_STATUS=0 begin 
    -- your code here 
    update UserInfo set fine = (calculation result) where [email protected] 
    fetch next from cur_loop into @ID 
end 
close cur_loop 
deallocate cur_loop 
+0

私は各ユーザーのための罰金を見つけるために行う必要がある計算があります。すべてのユーザーに対して、罰金は異なります。 –

+0

あなたのデザインを忘れているかもしれませんが、本当にトリガーが必要ですか?現在の日付の挿入を行うSPの更新ステートメントはありませんか? –

+0

@RichardHanley:上記の問題のために必要なスキーマ全体を投稿します。 –

2

カントあなたはこのような何か:「どこで」の句は、変更したいユーザーを選択するためのあなたの判断基準と罰金=あなたの計算

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 

はどこにいますか?

また、私はこれをテストいませんでしたが、あなたはUDFであなたの計算を持っている場合、私は私が私の更新ステートメントを持っていた場所がちょうどこのような何かを置くことができると思う:

CalculateFine 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 

ユーザーの詳細を罰金に変換する方法このようなUDF何かを

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 
+0

あなたが以前に尋ねたように、私は質問を変更しました –

+0

これはどのように各ユーザーに行うことができますか? –

+0

これは、currentdateテーブルを更新し、UserInfoテーブルのすべての行を更新するときに発生します。 UDF計算に「挿入された」日付の値を渡す必要がある場合も同様です。 –

関連する問題