今天我接收到一个任务就是创建一个数据脚本再原来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 语句集,如果该数据有些是比较重要的,需要客户有权限的人才能去执行,如果你一创建就执行了,那么这些数据又该由谁来负责呢?客户可能会认为有人操作而报警,而你则进入了监狱。所以在本地我们创建了会去执行查看是否正确,可将它创建到正式库里去的时候则不能执行的,也就在创建之时是不执行的,与创建视图执行是不一样的概念。
今天的日记随笔就写到这吧……
原文地址:https://www.cnblogs.com/Jack-S-Wang/p/10774636.html