【问题标题】:How to trigger before INSERT statement in stored procedure in SQL Server 2005?如何在 SQL Server 2005 存储过程中的 INSERT 语句之前触发?
【发布时间】:2012-09-14 14:28:51
【问题描述】:

我读了这个Help with SQL Server Trigger to truncate bad data before insert,但没有解决我关于存储过程的问题。

更新

因为我的问题Why cannot create global temporary table or truncate it when call a stored procedure from C# code? 在从 C# 代码调用时从存储过程中截断表。

结束更新

存储过程是

ALTER PROCEDURE [dbo].[aProcedure]
  @val1 VARCHAR(255),
  @val2 VARCHAR(255),
  ...
AS 
BEGIN
   SELECT @sql = '//Do SELECT statement'

    INSERT INTO dbo.MyTable(....)

    SELECT @paramList = ' /*list of parameters*/';

    EXEC sp_executesql @sql, @paramList, ... parameters
END

以及我使用的触发器(我是 SQL 初学者)

CREATE TRIGGER MyTrigger ON dbo.MyTable
FOR INSERT
AS
BEGIN
    TRUNCATE dbo.MyTable
END

如何触发,当从存储过程中将值插入dbo.MyTable,它首先截断我的表,然后进行INSERT操作?

我阅读了来自MSDNCodeProject 的文档。

谢谢

【问题讨论】:

  • 哇 - 在插入触发器中截断表应该会引起你同事的许多 lulz,但这是一个很好的例子,为什么触发器应该被视为最后的手段。
  • @nonnb:阅读我更新的问题。
  • 您是否没有注意到您似乎将损坏的解决方案堆积在损坏的解决方案之上?正如我在上一个问题上建议的那样,也许您需要退后一步,看看您正在处理的整体问题(而不是您决定的 solution 的当前问题)和看看有没有更好的方法来做到这一点?
  • 我没有找到比使用触发器更好的方法,我想这是一个很好的方法。我没有使用嵌套存储过程!
  • 大多数 SQL Server 开发人员很少使用全局临时表(如果有的话)。触发器并不常见,根据我的经验,TRUNCATE 也很少见。到目前为止,您的“解决方案”正在使用所有这 3 个。

标签: sql sql-server-2005


【解决方案1】:

在存储过程本身中截断表。 无需编写触发器。 触发器会减慢你的进程

ALTER PROCEDURE [dbo].[aProcedure]
  @val1 VARCHAR(255),
  @val2 VARCHAR(255),
  ...
AS 
BEGIN
   SELECT @sql = '//Do SELECT statement'

     TRUNCATE table  dbo.MyTable -- < add truncate here
    INSERT INTO dbo.MyTable(....)

    SELECT @paramList = ' /*list of parameters*/';

    EXEC sp_executesql @sql, @paramList, ... parameters
END

【讨论】:

【解决方案2】:
CREATE TRIGGER MyTrigger ON dbo.MyTable
AFTER INSERT
AS
BEGIN
    TRUNCATE dbo.MyTable
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多