我正在编写一个INSTEAD OF INSERT
触发器来拦截插入的数据并填写column2。
我需要执行一个存储过程,该存储过程返回要插入column2的值。
每次执行时,存储过程都会返回一个不同的值(加密prng)。
因此,如果有人插入10行,我的触发器应执行10次存储过程,并使用返回的值之一填充每一行。
我听说过,游标很少用于这样的事情。
但是我不确定标准循环是否也是最好的方法。
在,或语句中SELECT
,是否存在更简化的方法来实现此目的?UPDATE
INSERT
CREATE TRIGGER dbo.table1_instead_of_insert
ON dbo.table1
INSTEAD OF INSERT
AS BEGIN
DECLARE @i BIGINT ;
EXECUTE dbo.proc1 @1 ;
--proc1 sets the value of @i to a different value each time proc1 is executed
--(crypto prng)
--Update the value of column2 in INSERTED, setting it to the value of @i
--Repeat this process for each row in INSERTED,
--with proc1 returning a different value for each row
INSERT INTO dbo.table1 ( column1 , column2 )
SELECT column1 , column2 FROM INSERTED ;
END
GO
尝试这个:
CREATE TRIGGER dbo.table1_instead_of_insert
ON dbo.table1
INSTEAD OF INSERT
AS BEGIN
CREATE TABLE #DataSource
(
[RowID] INT IDENTITY(1,1)
,[Column1] VARCHAR(12) -- use your type
,[Column2] VARCHAR(12) -- use your type
);
INSERT INTO #DataSource ([Column1], [Column2])
SELECT [Column1], [Column2]
FROM inserted;
DECLARE @RowID TINYINT = 1;
DECLARE @i BIGINT ;
WHILE(EXISTS(SELECT 1 FROM #DataSource WHERE [RowID] = @RowID))
BEGIN;
EXECUTE dbo.proc1 @i ;
UPDATE #DataSource
SET [Column2] = @i
WHERE [RowID] = @RowID;
SET @RowID = @RowID + 1;
END;
INSERT INTO dbo.table1 ( column1 , column2 )
SELECT column1 , column2 FROM #DataSource ;
END
GO
这不好。很坏。它很容易破坏性能。在执行大量插入的环境中,您将为每一行执行此存储过程。
对于数据库经验较少的开发人员,一种常见的做法是逐行处理行。您应该尝试修改此存储过程以生成@i
值行-这样,您就可以跳过循环。
您也应该检查此链接。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句