存储过程一个简单编写样式与为什么创建存储过程时不执行操作的原因

Posted jack-s-wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了存储过程一个简单编写样式与为什么创建存储过程时不执行操作的原因相关的知识,希望对你有一定的参考价值。

今天我接收到一个任务就是创建一个数据脚本再原来8万条数据的基础上插入剩下的数据,总共数据为2千万条。之前是创建一个文本文件,进行上传导入数据的,但这个导入数据的时是要有6个月的时间跨度,那么上传一天一个文本,那就要创建180个文本文件,那是得不偿失的。因此想到了数据脚本写存储过程。

这是我简单插入数据,并根据一定的数量进行时间累加的存储过程脚本:

USE [eRAS]
GO

/****** Object:  StoredProcedure [dbo].[AddSrcCCAUTH]    Script Date: 2019/04/26 14:41:17 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[AddSrcCCAUTH]
    -- Add the parameters for the stored procedure here
    
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    declare @i int,@Card varchar(20),@count int,@datenow DateTime,@oldCount int
    --还需添加的数
    select @i=80001;
    --获取当前的时间
    select @datenow=GETDATE();
    select @oldCount=0;
    while(@i<=20000000)
    begin
    --设置卡号
    select @Card=‘42019‘+RIGHT(‘00000000000‘+CAST(@i as varchar),11);
    --计算需要添加时间的天数
    select @count=(@i-80000)/110667;

    if(@[email protected])
    begin
    select @[email protected];
    select @datenow=DATEADD(DAY,1,@datenow);
    end

    -- Insert statements for procedure here
    INSERT INTO dbo.SrcCCAUTH ([ID]
      ,[MEROUT_CARD_NBR]
      ,[MEROUT_ORIG_CURR_CODE]
      ,[MEROUT_ORIG_AMT]
      ,[MEROUT_LOCAL_MT]
      ,[MEROUT_MCC]
      ,[MEROUT_CHANNEL_IND]
      ,[MEROUT_TXN_AUTH_DATE]
      ,[MEROUT_TXN_AUTH_TIME]
      ,[MEROUT_TXN_COUNTRY]
      ,[MEROUT_REFERENCE_NBR]
      ,[MEROUT_UNIQUE_DATE]
      ,[MEROUT_UNIQUE_TIME]
      ,[MEROUT_UNIQUE_AUDT_TRACE]
      ,[MEROUT_UNIQUE_ACQ_ID]
      ,[MEROUT_UNIQUE_FWD_ID]
      ,[MEROUT_AVAILBLE_AMOUNT]
      ,[MEROUT_ACCOUNT_NBR]
      ,[MEROUT_PROCESS_CODE]
      ,[MEROUT_EAS_TC]
      ,[MEROUT_INPUT_SOURCE]
      ,[MEROUT_POS_ENTRY_MODE]
      ,[MEROUT_MERCH_NAME_LOC]
      ,[MEROUT_POS_COND_CODE]
      ,[MEROUT_MC_CARD_PRESENT]
      ,[MEROUT_AUTH_CODE]
      ,[MEROUT_LONG_DESC]
      ,[FILLER]
      ,[REPORT_DATE])
      VALUES (
      NEWID(),@Card,‘840‘,10.00,61.68,‘05999‘,‘5‘,‘2019-01-09 00:00:00.000‘,
      ‘084352‘,‘840‘,‘000000000009‘,‘20190109‘,‘084352‘,‘0000009‘,‘00000009685‘,
      ‘00000000000‘,54928.32,‘0005591390000622638‘,‘000000‘,‘053‘,‘M‘,‘8120‘,
      ‘Ecom01                 St. Louis     MO‘,‘‘,‘5‘,‘794416‘,‘‘,‘‘,@datenow
      );
      select @[email protected]+1;
      end
END
GO


在这里面我要提醒一下这个几个地方,参数设置可以在技术图片这个截图的位置上添加。设置值与declare(申明)是一样的,@id int这样就申明了一个为int类型的@id值。然后设置则用select关键字,在sql语句中用set关键字,但存储过程中我使用set是没有用的。 SET NOCOUNT ON;这句话则是为了取消执行多条执行语句返回的结果集,否则每次都返回一句“执行一条数据成功”是很浪费时间的。while或是if语句都是没有大括号来包含内容,因此这些语句都一样用begin和end来包含。

一个字符串想用一些字符来代替长度不够的部分,则可以使用RIGHT(‘00000000000‘+CAST(@i as varchar),11);语句,这里我是以总长度为11个字符进行设置的,cast则将int值转化为varchar值。

如果相对一个时间进行添加一天则可用这句话DATEADD(DAY,1,@datenow);第一个参数其实是指要添加的位置,day表示是要在时间的天数上加数值。最后一个参数则是目标值。

好了,其他的模式就没有什么可以多说的,这个存储过程写得不复杂,大家一看就明了了。现在就来讲讲要执行这个存储过程需要执行哪句话,为什么创建或是更新执行的时候是不执行存储过程的?

要想执行该存储过程我们可以执行exec AddSrcCCAUTH(存储数据表),执行这句话存储过程文件中的语句才被执行。如果停止不了,然后你不知道怎么停止则可以使用kill 56(这个是spid值)

如果你找不到该值则可以查询

SELECT t.[text],er.*
  FROM sys.dm_exec_requests AS er CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS t
WHERE [email protected]@SPID

执行该语句则可以查询到spid值。

其实技术图片就是截图中那个53的值,你执行的语句在哪里执行就关闭哪个查询sql。

好了最后说一下为什么创建了是不执行的,因为存储过程一般针对于一些比较复杂的,重复性较多的sql语句编写完成特定功能的SQL 语句集,如果该数据有些是比较重要的,需要客户有权限的人才能去执行,如果你一创建就执行了,那么这些数据又该由谁来负责呢?客户可能会认为有人操作而报警,而你则进入了监狱。所以在本地我们创建了会去执行查看是否正确,可将它创建到正式库里去的时候则不能执行的,也就在创建之时是不执行的,与创建视图执行是不一样的概念

今天的日记随笔就写到这吧……

 

以上是关于存储过程一个简单编写样式与为什么创建存储过程时不执行操作的原因的主要内容,如果未能解决你的问题,请参考以下文章

在SQLSERVER里面,如何写一个存储过程来创建跟踪?

如何在优势数据架构师中编写一个简单的存储过程

简单的mysql存储过程

数据库-存储过程

MySql中存储过程的理解

在 Firebird 中使用 Qt 存储过程