SQL存储过程例子

 

  存储过程呢,学校里学习的都是简单的。这里是我在工作的时候写的存储过程,贴出来,其中公司相关我都XXX代替了

  (注:这个例子可以算是动态SQL的例子了,写死的是静态SQL,这个很灵活的传入参数的是动态SQL,静态的一次编译多次调用具有安全性。动态的需要次次编译,强大但有安全隐患)  

 

USE [XX]
GO
/****** Object:  StoredProcedure [dbo].[OneTable]    Script Date: 2018/1/12 9:41:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[OneTable] @TableName nvarchar(50)
as
begin
declare @sql nvarchar(1000)
select  @sql=isnull(@sql+',','')+quotename(Name) from syscolumns where  id=object_id(@TableName) and name not in ('DATE','TIME')
declare @sqlstr varchar(4000)
set @sqlstr='select a.DateTime,b.NodeID,a.SupplyNum,301 as FactoryID from
(
SELECT rtrim(convert(varchar,replace([Date],''/'',''-'')))+'' ''+ ltrim(convert(varchar,[Time])) [DateTime] ,P.SupplyNum,p.Supplier
FROM 
(
    SELECT top 1 *
     FROM '+@TableName+'
)T
UNPIVOT 
(    
    SupplyNum FOR Supplier IN
    ('+@sql+')
) P) a inner join XXXX.dbo.XXX b on a.Supplier=b.TagName' 

------insert单张表的数据到XXX
insert XXXX.dbo.XXX    exec(@sqlstr)

------delete
      declare @mindatestr varchar(50)
      set @mindatestr=CONVERT(VARCHAR(100),getdate()-3,20)
      delete from XXXX.[dbo].XXX where DateTime<@mindatestr

end

 

  现在我需要只插入20分钟以内的数据,我顿时慌了,动态SQL无法取里面的时间怎么办~~我这是蠢成猪的表现了~~

经过同事的开导我才恍然大悟,在动态SQL里面加一个时间判断不就好了嘛。。。

and DATEDIFF(MINUTE,a.DateTime,GETDATE())<20

       像这样。。。人蠢了。。。拦都拦不住。。。

 

 

  2018.8.4日更新

 

  在做数据同步的时候也可以使用这个存储过程,很好用。有一个问题,你在同步数据的时候,要做一个时间的增量判断。不要整张表整张表的数据插入同步。应该是只同步需要更新的数据。

and DateTime>  dateadd(MINUTE,-1,GETDATE())

例如上面的sql语句,我同步的那个表的数据是一分钟更新一次的,那我就一分钟同步一次。同步的时候只同步上一分钟的数据。这样就保证了你同步的只是最新的数据。

 

posted @ 2018-01-12 10:33  蜀云泉  阅读(712)  评论(0编辑  收藏  举报