2017-10-17 88 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

嘗試:'CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION INSERT ON TF_WATCHLIST_PERSISTENCE 之後開始 UPDATE TF_WATCHLIST_PERSISTENCE SET WATCHLIST_POSITION =(SELECT COUNT(*) - 1 FROM TF_WATCHLIST_PERSISTENCE WHERE WATCHLIST_USER = inserted.WATCHLIST_USER) WHERE ROWID =插入.rowid和inserted.WATCHLIST_POSITION爲空' – TheGameiswar

+0

謝謝......但我的Management Studio不接受語法。 如果我把它改寫這樣的,它變得更好: CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION ON TF_WATCHLIST_PERSISTENCE INSERT ON TF_WATCHLIST_PERSISTENCE之後開始UPDATE TF_WATCHLIST_PERSISTENCE SET WATCHLIST_POSITION =(SELECT COUNT(*) - 1 TF_WATCHLIST_PERSISTENCE WHERE WATCHLIST_USER = inserted.WATCHLIST_USER)WHERE ROWID =插入。 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,行6 無法綁定多部分標識符「inserted.rowid」。 Msg 4104,Level 16,State 1,Procedure TF_WATCHLIST_PERSISTENCE_ADD_POSITION,Line 6 無法綁定多部分標識符「inserted.WATCHLIST_POSITION」。 –

+0

@SimonBruun你可以再試一次嗎? – gotqn

+0

rowid不是TF_WATCHLIST_PERSISTENCE表中的永久列。 我認爲rowid是mySQL中的內建「列」。 TF_WATCHLIST_PERSISTENCE定義: CREATE TABLE [DBO] [TF_WATCHLIST_PERSISTENCE]( \t [WATCHLIST_USER] [VARCHAR](250)NOT NULL, \t [WATCHLIST_ID] [VARCHAR](250)NOT NULL, \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或窗口函數中相當差,所以使用諸如奇怪更新或觸發器等技巧來模擬它們。

在SQL Server中,你可以返回的單個用戶與COUNT()每一行應用在單個用戶相匹配的記錄相匹配的記錄數:

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

無需觸發。您可以使用任何具有OVER()子句的聚合。

如果您想按照某種順序排列排名,您可以使用ROW_NUMBER()或RANK()等排名函數之一。如果要計算基於每個用戶的一排位置,例如在創建日期,你可以寫:

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

如果你有,你可以用它來生成一個row position每用戶

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

一個遞增的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() –