2017-10-17 12 views
0

このmySQLトリガーをTSQLに変換するためのヘルプを探しています。mySQLトリガーをTSQLに変換する

CREATE TRIGGER IF not exists TF_WATCHLIST_PERSISTENCE_ADD_POSITION 
AFTER INSERT ON TF_WATCHLIST_PERSISTENCE 
FOR EACH ROW 
WHEN NEW.WATCHLIST_POSITION IS NULL 
BEGIN 
    UPDATE TF_WATCHLIST_PERSISTENCE SET 
    WATCHLIST_POSITION = (SELECT COUNT(*) - 1 FROM TF_WATCHLIST_PERSISTENCE WHERE WATCHLIST_USER = NEW.WATCHLIST_USER) 
    WHERE rowid = NEW.rowid; 
END; 
+0

これを試す: 'INSERT ON TF_WATCHLIST_PERSISTENCE が UPDATE TF_WATCHLIST_PERSISTENCE SET WATCHLIST_POSITION =開始した後TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION を作成する(SELECT COUNT(*) - WATCHLIST_USER = inserted.WATCHLIST_USER TF_WATCHLIST_PERSISTENCE FROM 1)行IDが=挿入 .rowidとinserted.WATCHLIST_POSITIONがnullです。 ' – TheGameiswar

+0

ありがとう...しかし、私のManagement Studioは構文を受け入れません。 私はこのようにそれを書き換える場合、それはよくなる:INSERT ON TF_WATCHLIST_PERSISTENCEはUPDATE TF_WATCHLIST_PERSISTENCE SET WATCHLIST_POSITION =開始した後 がTF_WATCHLIST_PERSISTENCEでトリガTF_WATCHLIST_PERSISTENCE_ADD_POSITION作成 - 行ID =挿入(SELECT COUNT(*)WATCHLIST_USER = inserted.WATCHLIST_USER TF_WATCHLIST_PERSISTENCE 1から)。 rowidと挿入されます。WATCHLIST_POSITIONがヌルです しかし、それは "AS、NOT_FOR、With"と表示されます –

+0

あなたはssmsを使用していますか? – TheGameiswar

答えて

0

これを試してみてください:

CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION ON TF_WATCHLIST_PERSISTENCE AFTER INSERT 
AS 
BEGIN 
    WITH DataSource AS 
    (
     SELECT DS.WATCHLIST_USER 
       ,COUNT(*) - 1 AS WATCHLIST_POSITION 
     FROM TF_WATCHLIST_PERSISTENCE DS 
     INNER JOIN inserted I 
      ON DS.WATCHLIST_USER = I.WATCHLIST_USER 
     WHERE inserted.WATCHLIST_POSITION is null 
     GROUP BY DS.WATCHLIST_USER 
    ) 
    UPDATE TF_WATCHLIST_PERSISTENCE 
    SET WATCHLIST_POSITION = DS.[WATCHLIST_POSITION] 
    FROM TF_WATCHLIST_PERSISTENCE DS 
    INNER JOIN DataSource I 
     ON DS.WATCHLIST_USER = I.WATCHLIST_USER; 
END 
+0

こんにちは、私は次のエラーを取得 をgotqn: メッセージ207、レベル16、状態1、プロシージャTF_WATCHLIST_PERSISTENCE_ADD_POSITION、6行目 無効な列名が「のROWID」。 メッセージ4104、レベル16、状態1、プロシージャTF_WATCHLIST_PERSISTENCE_ADD_POSITION、Line 6 マルチパート識別子 "inserted.rowid"をバインドできませんでした。 メッセージ4104、レベル16、状態1、プロシージャTF_WATCHLIST_PERSISTENCE_ADD_POSITION、Line 6 マルチパート識別子 "inserted.WATCHLIST_POSITION"はバインドできませんでした。 –

+0

@SimonBruunもう一度やり直せますか? – gotqn

+0

rowidはTF_WATCHLIST_PERSISTENCEテーブルの永続カラムではありません。 私はrowidがmySQLの組み込み "列"だと思います。 TF_WATCHLIST_PERSISTENCE定義: は[DBO] CREATE TABLEを[TF_WATCHLIST_PERSISTENCE( \t [WATCHLIST_USER] [VARCHAR(250)NOT NULL、 \t [WATCHLIST_ID] [VARCHAR(250)NULL NOT、 \t [WATCHLIST_DATA] [。 VARCHAR(4000)NOT NULL、 は\t [WATCHLIST_POSITION] [INT] NULL、 PRIMARY KEY CLUSTERED ( \t [WATCHLIST_USER] ASC、 \t [WATCHLIST_ID] ASC ) –

0

私はあなたがランキング機能を探している疑いがある、またはユーザーごとにさえ、単純なCOUNT(*)? MySQLはanalyticrankingやウィンドウ関数ではお粗末なので、気まぐれな更新やトリガーを使ってそれらをエミュレートするトリックがあります。トリガの

SELECT *, COUNT(*) OVER (PARTITION BY WATCHLIST_USER) 
FROM TF_WATCHLIST_PERSISTENCE 

必要がありません:

は、SQL Serverでは、あなたは、単一のユーザーに一致するレコードの上に適用COUNT()と、各行に単一のユーザーに一致するレコードの数を返すことができます。 OVER()句を持つ集約を使用できます。

ランクを何らかの順序で使用したい場合は、ROW_NUMBER()や `RANK()などのランキング機能の1つを使用できます。あなたがベースのユーザごとの行の位置を計算したい場合は、作成日に、たとえば次のように書くことができます:

SELECT *, ROW_NUMBER(*) OVER (PARTITION BY WATCHLIST_USER ORDER BY CreationDate) 
FROM TF_WATCHLIST_PERSISTENCE 

あなたはユーザー

SELECT *, ROW_NUMBER(*) OVER (PARTITION BY WATCHLIST_USER ORDER BY ID) 
FROM TF_WATCHLIST_PERSISTENCE 

あたりrow positionを生成するためにそれを使用することができますインクリメントIDをお持ちの場合ほとんどの場合、は行番号を格納する必要がありません。ランキング機能をクエリに追加するだけでも簡単です。

あなたがテーブルで、このような行の位置を格納する必要がない場合は、あなたが簡単なマルチ行トリガーを使用することができ

CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION 
ON TF_WATCHLIST_PERSISTENCE 
AFTER INSERT, UPDATE 
AS 
    update TF_WATCHLIST_PERSISTENCE 
    set WATCHLIST_POSITION =ROW_NUMBER() OVER (PARTITION BY WATCHLIST_USER ORDER BY ID) 
    FROM inserted 
    INNER JOIN TF_WATCHLIST_PERSISTENCE on inserted.ID=TF_WATCHLIST_PERSISTENCE.ID 

それとも、のための新しいエントリを挿入したい場合は

update TF_WATCHLIST_PERSISTENCE 
set WATCHLIST_POSITION =ROW_NUMBER() OVER (PARTITION BY WATCHLIST_USER ORDER BY ID) 
FROM inserted 
INNER JOIN TF_WATCHLIST_PERSISTENCE 
    ON inserted.WATCHLIST_USER =TF_WATCHLIST_PERSISTENCE.WATCHLIST_USER 

既存のユーザーとすべての位置を再計算する

1

ありがとうございました。ご協力ありがとうございました

私はこれで終わった。

CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION 
ON TF_WATCHLIST_PERSISTENCE 
AFTER INSERT, UPDATE 
AS 
DECLARE @MyCursor CURSOR; 
DECLARE @MyField_USER varchar(250); 
DECLARE @MyField_ID varchar(250); 
DECLARE @MyField_NewPos int 

BEGIN 
SET @MyCursor = CURSOR FOR 
SELECT  WATCHLIST_USER 
     , WATCHLIST_ID 
FROM inserted 
WHERE inserted.WATCHLIST_POSITION is null 

OPEN @MyCursor 
FETCH NEXT FROM @MyCursor 
INTO @MyField_USER, @MyField_ID 

WHILE @@FETCH_STATUS = 0 

BEGIN 
    set @MyField_NewPos = (SELECT MAX(WATCHLIST_POSITION) + 1 FROM TF_WATCHLIST_PERSISTENCE WHERE WATCHLIST_USER = @MyField_USER) 
    print @MyField_NewPos 

    update TF_WATCHLIST_PERSISTENCE 
     SET WATCHLIST_POSITION = ISNULL(@MyField_NewPos,0) 
     WHERE  WATCHLIST_USER = @MyField_USER 
      AND  WATCHLIST_ID = @MyField_ID 
      AND  WATCHLIST_POSITION IS NULL 

     Print @MyField_USER 
     Print @MyField_ID 
     FETCH NEXT FROM @MyCursor 
     INTO @MyField_USER, @MyField_ID 
END; 


END; 
CLOSE @MyCursor 
+0

なぜ?ユーザーあたりの増分値を計算するために*カーソル*は必要ありません。これは、同等の単一の更新よりもN倍遅くなります。ここでNは行数です。なぜ 'ROW_POSITION()'を使わないのですか?また、前の最大値から開始したい場合は 'MAX()'を追加してください –