执行存储过程以在插入之前更新每一行

吉菲吉

我正在编写一个INSTEAD OF INSERT触发器来拦截插入的数据并填写column2。

我需要执行一个存储过程,该存储过程返回要插入column2的值。
每次执行时,存储过程都会返回一个不同的值(加密prng)。

因此,如果有人插入10行,我的触发器应执行10次存储过程,并使用返回的值之一填充每一行。

我听说过,游标很少用于这样的事情。
但是我不确定标准循环是否也是最好的方法。

,或语句中SELECT是否存在更简化的方法来实现此目的UPDATEINSERT

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
Gotqn

尝试这个:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在SSIS中为表中的每一行执行存储过程

来自分类Dev

为表的每一行运行存储过程

来自分类Dev

在执行更新/删除之前获取一行

来自分类Dev

SQL Server 2008-为表的每一行调用存储过程的最佳实践

来自分类Dev

在命令或可执行文件的输出的每一行之前添加时间戳

来自分类Dev

在SQL中插入一行并在存储过程中设置变量?

来自分类Dev

遍历临时表的所有行,并为每一行调用一个存储过程

来自分类Dev

MySQL循环每一行并更新

来自分类Dev

在更新语句执行期间为每一行调用Now()

来自分类Dev

Scala,读取文件操作每一行,将每一行插入列表

来自分类Dev

从C#启动的Firebird存储过程,插入两行或更多行,只需要一行

来自分类Dev

在使用jQuery发送之前,请先阅读每一行

来自分类Dev

仅执行插入和其他更新的一行操作?

来自分类Dev

仅执行插入和其他更新的一行操作?

来自分类Dev

在最后一行之前插入文本N行

来自分类Dev

在最后一行之前插入文本N行

来自分类Dev

如果存在UPDATE,则对表的每一行插入INSERT

来自分类Dev

在大表的每一行上插入不同的UUID

来自分类Dev

如何在文件的每一行之后插入字符?

来自分类Dev

如何在文件的每一行之后插入字符?

来自分类Dev

如何使用 getdate() + 20 秒插入每一行

来自分类Dev

在转到R中的下一行之前,如何使函数返回每一行的值?

来自分类Dev

Oracle-对结果集的每一行执行操作

来自分类Dev

TSQL-为选择的每一行执行代码

来自分类Dev

bash在文件的每一行上执行多次抓取

来自分类Dev

TSQL-为选择的每一行执行代码

来自分类Dev

Oracle-对结果集的每一行执行操作

来自分类Dev

在字符串的每一行上执行操作

来自分类Dev

bash在文件的每一行上执行多次抓取

Related 相关文章

  1. 1

    在SSIS中为表中的每一行执行存储过程

  2. 2

    为表的每一行运行存储过程

  3. 3

    在执行更新/删除之前获取一行

  4. 4

    SQL Server 2008-为表的每一行调用存储过程的最佳实践

  5. 5

    在命令或可执行文件的输出的每一行之前添加时间戳

  6. 6

    在SQL中插入一行并在存储过程中设置变量?

  7. 7

    遍历临时表的所有行,并为每一行调用一个存储过程

  8. 8

    MySQL循环每一行并更新

  9. 9

    在更新语句执行期间为每一行调用Now()

  10. 10

    Scala,读取文件操作每一行,将每一行插入列表

  11. 11

    从C#启动的Firebird存储过程,插入两行或更多行,只需要一行

  12. 12

    在使用jQuery发送之前,请先阅读每一行

  13. 13

    仅执行插入和其他更新的一行操作?

  14. 14

    仅执行插入和其他更新的一行操作?

  15. 15

    在最后一行之前插入文本N行

  16. 16

    在最后一行之前插入文本N行

  17. 17

    如果存在UPDATE,则对表的每一行插入INSERT

  18. 18

    在大表的每一行上插入不同的UUID

  19. 19

    如何在文件的每一行之后插入字符?

  20. 20

    如何在文件的每一行之后插入字符?

  21. 21

    如何使用 getdate() + 20 秒插入每一行

  22. 22

    在转到R中的下一行之前,如何使函数返回每一行的值?

  23. 23

    Oracle-对结果集的每一行执行操作

  24. 24

    TSQL-为选择的每一行执行代码

  25. 25

    bash在文件的每一行上执行多次抓取

  26. 26

    TSQL-为选择的每一行执行代码

  27. 27

    Oracle-对结果集的每一行执行操作

  28. 28

    在字符串的每一行上执行操作

  29. 29

    bash在文件的每一行上执行多次抓取

热门标签

归档