如何在sql创建一条插入数据的存储过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在sql创建一条插入数据的存储过程相关的知识,希望对你有一定的参考价值。

1、首先需要打开SQL Server Managment管理工具,新建一个表。

2、然后在表中插入一些样例数据。

3、接下来在SQL Server Managment中右键单击可编程性,选择新建存储过程。

4、然后在SQL编写界面中编写SQL语句,注意这里的@name就是接收的输入参数。

5、编写好存储过程,执行一下,就会在可编程性下面找到创建的存储过程。

6、最后通过exec调用一下存储过程,在调用的时候传入参数,就实现了带参数的存储过程编写了。

参考技术A create or replace PROCEDURE test_insert -定义名称
(in_insert in number
in_insert2 in number, -定义输入值
on_code out number) -定义输出值
is
begin -开始实施
insert into table_name (列名1,列名2,列名3)
values (in_insert,in_insert2) --操作语句执行插入表 end
test_insert ;本回答被提问者采纳
参考技术B create proc insert_proc
@id int,
@name varchar(20)

as
insert into [.....](id,name)
values(@id,@name)

一个很简单的存储过程
参考技术C create procedure procIsert
as @username varchar(20),@password(20) varchar(20)
as insert into tbl_user(username,password) values(@username,@password)
参考技术D DELIMITER //
CREATE PROCEDURE INSERT_ID(IN looptimes INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < looptimes DO
INSERT INTO book(id) VALUES(i);
SET i=i+1;
END WHILE;
END //
DELIMITER;

如何将存储过程的结果返回到用于插入记录的选择语句

【中文标题】如何将存储过程的结果返回到用于插入记录的选择语句【英文标题】:How do I return the result of a stored procedure to a select statement that is being used to insert records 【发布时间】:2016-09-27 13:05:14 【问题描述】:

我正在编写一个脚本来在软件更新后转换一些数据。我正在引入一个新表,需要将现有表中的数据提取到这个新表中。我需要从一个表中获取一个现有的 varchar(max) 字段,在另一个表中基于它创建一个父子记录,然后在另一个表中插入新父记录的标识。

所以它有点想看起来像这样

INSERT INTO NEWTABLE (val1, val2, val3) 
SELECT 
    val1,
    val2,
    EXEC AStoredProc(val3) -- this obviosuly doesnt work
FROM EXISTINGTABLE

CREATE PROCEDURE AStoredProc
  @Value nvarchar(max),
  @NewID int OUTPUT

  DECLARE @ParentID int

  INSERT INTO AnotherTable ([Text], ParentNodeID)
  VALUES ('',NULL)

  SELECT @ParentID = SCOPE_IDENTITY()

  INSERT INTO AnotherTable  ([Text], ParentNodeID)
  VALUES (@Value,@ParentID)

  SELECT @ParentID

END

在上面的示例中,val1 和 val2 字段只是直接迁移到新表中。新表中的 val3 是一个 int 并且是从 AStoredProc 的结果插入的,它采用现有表的 varchar(max) val3 值在另一个表中创建几个记录并从它们返回新的父 ID,然后在新表中作为 val3 插入。

不用担心设计的原因,我怎样才能在存储过程中运行一些插入内容并将结果直接返回到外部 Select 语句?

【问题讨论】:

【参考方案1】:

我能想到的两个选项是:

    使用CURSOR

    DECLARE @val1 datatype1,
            @val2 datatype2,
            @val3 NVARCHAR(MAX),
            @ParentID INT;
    
    DECLARE migrate CURSOR LOCAL STATIC
    FOR  SELECT et.val1, et.val2, et.val3
         FROM   EXISTINGTABLE et
         WHERE  NOT EXISTS (
                       SELECT *
                       FROM   NEWTABLE nt
                       WHERE  nt.val1 = et.val1
                       AND    nt.val2 = et.val2
                           );
    
    BEGIN TRY
    
    OPEN migrate
    
    FETCH NEXT
    FROM  migrate
    INTO  @val1, @val2, @val3;
    
    WHILE (@@FETCH_STATUS <> 0)
    BEGIN
      BEGIN TRAN;
    
      EXEC dbo.AStoredProc
               @Value = @val3,
               @NewID = @ParentID OUTPUT;
    
      INSERT INTO NEWTABLE (val1, val2, val3)
      VALUES (@val1, @val2, @ParentID);
    
      COMMIT;
    END;
    
    CLOSE migrate;
    DEALLOCATE migrate;
    
    END TRY
    BEGIN CATCH
      ROLLBACK TRAN;
      -- catch block stuff goes here
    END CATCH;
    

    至少在示例代码的存储过程中列出的第一个AnotherTable(即生成@ParentID 值的表)中创建一个“临时”列,以保存新创建记录的关联。这将允许进行基于集合的操作,因为查询可以作为单独的步骤完成。如果EXISTINGTABLE 中已经有一个 IDENTITY 值/易于使用的 PK,则只需使用它,否则如果临时列是 UNIQUEIDENTIFIER 并使用 NEWID(),则可以轻松创建一个新值。但假设目前是幸福的道路(即EXISTINGTABLEINT PK),那么它会是这样的:

    -- set up temporary association column
    ALTER TABLE dbo.AnotherTable
      ADD [TempAssociationID] INT NOT NULL;
    
    BEGIN TRY
    
    BEGIN TRAN;
    
    -- populate initial "parent" records
    INSERT INTO dbo.AnotherTable ([Text], [TempAssociationID])
      SELECT '', et.PK_column
      FROM   dbo.EXISTINGTABLE et;
    
    -- populate "child" records
    INSERT INTO dbo.AnotherTable ([Text], [TempAssociationID], ParentNodeID)
      SELECT et.val3, et.PK_column, anthr.ID_column AS [ParentNodeID]
      FROM   dbo.EXISTINGTABLE et
      INNER JOIN  dbo.AnotherTable anthr
              ON  anthr.[TempAssociationID] = et.PK_column
             AND  anthr.[ParentNodeID] IS NULL;
    
    -- combine existing and secondary tables for "new" table
    INSERT INTO dbo.NEWTABLE (val1, val2, val3)
      SELECT  et.val1, et.val2, anthr.ID_column AS [val3]
      FROM    dbo.EXISTINGTABLE et
      INNER JOIN  dbo.AnotherTable anthr
              ON  anthr.[TempAssociationID] = et.PK_column
             AND  anthr.[ParentNodeID] IS NULL;
    
    COMMIT TRAN;
    
    END TRY
    BEGIN CATCH
      ROLLBACK TRAN;
      -- other catch block stuffs
    END CATCH;
    
    ALTER TABLE dbo.AnotherTable
      DROP COLUMN [TempAssociationID];
    

【讨论】:

是的,我有点想他们会是我的选择。认为我将采用光标方法。有点希望它可以在一个容易回滚的事务中完成 @StewartAlan 可以...让我完成选项 2 ;-)。 @StewartAlan 请查看竞争选项#2 :)

以上是关于如何在sql创建一条插入数据的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何将存储过程的结果返回到用于插入记录的选择语句

mssql 里面存储过程插入了条数据之后的返回

SQL快速生成连续整数

sql server中怎么把一个表的数据全部插入到另一个表,每次1000条的插入,一次执行,不要在存储过程里改的

MSSQL更新数据,某主键存在则更新,不存在则插入

Mysql用存储过程和事件每月定时创建一张数据库表