存储过程呢,学校里学习的都是简单的。这里是我在工作的时候写的存储过程,贴出来,其中公司相关我都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语句,我同步的那个表的数据是一分钟更新一次的,那我就一分钟同步一次。同步的时候只同步上一分钟的数据。这样就保证了你同步的只是最新的数据。