2017-10-17 160 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() –