0

私はSQLServerトリガーの見知らぬ人です。私はこのような問題を抱えることになりました。ご覧ください。

  1. 'users'と'test'の2つのテーブルがあります

       CREATE TABLE users( 
                 email VARCHAR(250),
                 rank FLOAT
          );
    
        CREATE TABLE test(
              score INT,
             total INT
        );
    
  2. トリガーを作成する必要があります。

    2.1 avgの値でユーザーランクを更新します(avg = test.score / test.total)
    2.2これまでに試したことは次のとおりです。

    CREATE TRIGGER auto_rank ON dbo.test FOR INSERT
     BEGIN
     DECLARE @sc INT
     DECLARE @tot INT
     DECLARE @avg FLOAT
     @tot = SELECT inserted.total FROM dbo.test
     @sc = SELECT inserted.score FROM dbo.test
     SET @avg=@sc/@tot
     UPDATE dbo.users SET rank=@avg WHERE email=inserted.email
     END
    
4

4 に答える 4

0

テーブルデザインからテスト中の電子メールが欠落していますが、コードごとにそのような列が必要です。

UPDATE dbo.users SET rank=@avg WHERE email=inserted.email

次に、この場合、トリガーの代わりにビューが必要です。

Create view user as (select email, score/total as rank from test group by email);

この助けを願っています。

于 2013-03-12T06:51:41.493 に答える
0

テストテーブルに電子メール列が含まれるように、テーブルを変更する必要があります。

CREATE TABLE test(score INT,
                  total INT,
                  email varchar(250)
                 );

次に、次のようにtrgigerを作成できます。

CREATE TRIGGER [dbo].[auto_rank] ON [dbo].[test]
FOR INSERT
AS
BEGIN 
  DECLARE MyCursor CURSOR FOR
  SELECT score, total, email FROM Inserted
  DECLARE @sc INT
  DECLARE @tot INT
  DECLARE @email VARCHAR(30)
  DECLARE @avg FLOAT
  DECLARE @MSG VARCHAR(50)
  OPEN MyCursor;
  FETCH NEXT FROM MyCursor INTO @sc, @tot, @email
  WHILE @@FETCH_STATUS = 0
  BEGIN
    SELECT @avg=@sc/@tot
    UPDATE users SET rank=@avg WHERE users.email=@email
    SELECT @MSG = 'email Updated ' + @email + '. New Rank is ' + Str(@avg, 25, 5);
    PRINT @MSG
    FETCH NEXT FROM MyCursor
  END;
  CLOSE MyCursor;
  DEALLOCATE MyCursor;
END
于 2013-03-12T06:51:50.447 に答える
0

これを試して :

CREATE TRIGGER auto_rank ON dbo.test FOR INSERT
BEGIN



UPDATE a SET a.rank=b.rn

from 
users a
inner join
(select email,inserted.score/inserted.total rn from inserted)b 
on a.email=b.email

END

私はこれをテストしていませんが、これはうまくいくはずです。

于 2013-03-12T09:07:16.090 に答える
-1

このスレッドを続けるのに遅れて申し訳ありませんが、私は答えを見つけたと言ってうれしいです。それは皆さんのおかげです。

だから、これが私がしたことです。

最初;

CREATE TABLE users( 
   email VARCHAR(250),
   rank FLOAT,
   constraint pk_users PRIMARY KEY(email)
);

CREATE TABLE test(
   email VARCHAR(250),
   score INT,
   total INT,
   constraint pk_test PRIMARY KEY(email),
   constraint fk_from_users FOREIGN KEY(email) references users(email)
);

create trigger trig_ex02 on dbo.test
after insert
as
begin
declare @score FLOAT
declare @total FLOAT
declare @average FLOAT
declare @msg varchar(100)
declare @email varchar(250)
set @email = (select email from inserted)
set @score = (select score from inserted)
set @total = (select total from inserted)
set @average =(@score/@total)
select @msg = 'SCORE IS'+ str(@score)+'TOTAL IS'+str(@total)+' AVERAGE IS ' +str(@average,25,5)+' END '
print @msg
UPDATE users SET rank=@average WHERE users.email=@email
end;
于 2013-03-18T10:07:08.057 に答える