一.在生产中涉及到SQL-Server数据库存储过程,顺便学习记录
--创建存储过程 可生成当年所有日期,并且周末工作时间为0小时 ,其中HR_Calendar 为业务表
CREATE PROCEDURE dbo.Auto_HR_Calendar
AS
SET DATEFIRST 1
declare @i varchar(10)
declare @j int
declare @year int
declare @num int
set @j = 110
set @i= dateadd(d,1-datepart(dy,getdate()),getdate())
set @year=datepart(yy,@i)
SELECT @num= COUNT(1) FROM HR_Calendar WHERE HRC_ID LIKE 'HRC'+CONVERT(varchar(10),@year)+'%'
if (@num=0)
begin
while(@year=datepart(yy,@i))
begin
if(DATEPART(dw, @i)>5)
begin
insert into HR_Calendar (HRC_ID,HRC_Date,
HRC_WorkHour) values('HRC'+CONVERT(varchar(10),@year)+'00000'+CONVERT(varchar(10),@j),@i,0)
end
else
begin
insert into HR_Calendar (HRC_ID,HRC_Date,
HRC_WorkHour) values('HRC'+CONVERT(varchar(10),@year)+'00000'+CONVERT(varchar(10),@j),@i,8)
end
set @i=dateadd(d,1,@i)
set @j=@j+1
end
end
Go
二),工作中涉及数据批量插入时可用到sqlserver新特性:Bulk和表值参数(Table-Valued Parameters),我用的是表值参数
顾名思义,表值参数表示你可以把一个表类型作为参数传递到函数或存储过程里。
实例讲解:
第一步:创建一个Type类型和写入数据的原始表结构相同
CREATE TYPE [dbo].[TestTVP] AS TABLE(
[TID] [bigint] NOT NULL,
[DepID] [nvarchar](100) NOT NULL,
[DepName] [nvarchar](512) NOT NULL,
[DataChange_CreateTime] [datetime] NOT NULL,
[DataChange_LastTime] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED
(
[TID] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
第二步:创建存储过程
CREATE PROCEDURE [dbo].[SP_TestTVP_I]
(
@TestTVP TestTVP READONLY
)