当前位置: 首页 > 面试题库 >

如何在存储过程中使用插入/删除表?

毋承基
2023-03-14
问题内容

我为几个表创建触发器。触发器具有相同的逻辑。我将要使用一个通用的存储过程。但是我不知道如何处理 插入删除的 表。

例子:

SET @FiledId = (SELECT FiledId FROM inserted)
begin tran
   update table with (serializable) set DateVersion = GETDATE()
   where FiledId = @FiledId

   if @@rowcount = 0
   begin
      insert table (FiledId) values (@FiledId)
   end
commit tran

问题答案:

您可以使用表值参数存储触发器中插入/删除的值,并将其传递给proc。例如,如果您在proc中所需的全部是UNIQUE
FileID's

CREATE TYPE FileIds AS TABLE
(
    FileId INT
);

-- Create the proc to use the type as a TVP
CREATE PROC commonProc(@FileIds AS FileIds READONLY)
    AS
    BEGIN
        UPDATE at
            SET at.DateVersion = CURRENT_TIMESTAMP
        FROM ATable at
            JOIN @FileIds fi
            ON at.FileID = fi.FileID;
    END

然后从触发器中传递插入/删除的ID,例如:

CREATE TRIGGER MyTrigger ON SomeTable FOR INSERT
AS
    BEGIN
        DECLARE @FileIds FileIDs;
        INSERT INTO @FileIds(FileID)
            SELECT DISTINCT FileID FROM INSERTED;
        EXEC commonProc @FileIds;
    END;


 类似资料:
  • 我想知道如何使用SQL在DB2中使用存储过程插入到表中。我创建了一个如下表: 此表包含项目列表。使用此列表,我想将其他各种字段插入到另一个表中。但是,举个例子,假设我只想使用游标逐个插入这些值。我将存储过程编写如下: 这给了我一个无限循环。谁能告诉我如何停止无限循环并插入这些记录。我想使用光标,因为我想进一步使用itemno来比较并获得单个结果。

  • 问题内容: 我有一个存储过程,该过程将通过复制旧表的结构来创建新表。但是在创建新表之前,我需要检查该表是否存在,如果存在,则需要先删除该表。这是我的存储过程。 但是,如果该表存在,我总是会收到类似以下的错误。哪里错了? 问题答案: 让我感到难过…在这种情况下,“如果存在”似乎无法与exec配合使用。更新了以下脚本:

  • 存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。 MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下: DROP PROCEDURE [ IF EXISTS ] <过程名> 语法说明如下: 过程名:指定要删除的存储过程的名称。 IF EXISTS:指定这个关键字,

  • 问题内容: 这与问题653714非常相似,但是对于MySQL而不是SQL Server。 基本上,我有一个复杂的选择,它是几个存储过程的基础。我想在存储过程中共享代码,但是,我不确定该怎么做。我可以这样做的一种方法是,使共享选择存储过程,然后从其他存储过程中调用该存储过程。我不知道如何使用嵌套存储过程的结果集。如果我可以将它们放在临时表中,则可以有效地使用结果,但是我不知道如何将它们放入临时表中。

  • 我想写一个DB2过程来对一个表进行常见的插入/更新/删除,问题是如何生成带有随机值的SQL语句?例如,如果是整数类型的列,存储过程可以生成1到10000之间的数字,或者对于varchar类型的列,存储过程可以生成固定长度的随机选择字符字符串,例如10; 2? 3.usingDB2“导入”来加载数据,如果文件包含10000行,那么DB2默认情况下似乎会在一个事务中提交整个10000行插入。是否有任何

  • 问题内容: 做一个学校的项目,所以任何帮助将是巨大的谢谢! 我有两个表-如何插入两个表中?因此,两个表都是链接的。 用自动递增的主键调用第一个表 第二个称为的表具有链接到父表的外键 问题答案: 您需要执行以下操作: SCOPE_IDENTITY : 返回插入到同一作用域的标识列中的最后一个标识值。范围是一个模块:存储过程,触发器,函数或批处理。因此,如果两个语句位于相同的存储过程,函数或批处理中,