实现动态化,为表添加存储时间字段,insus.net写一个存储过程,如下
set ansi_nulls on
go
set quoted_identifier on
go
-- =============================================
-- author: insus.net
-- blog: https://insus.cnblogs.com
-- create date: 2019-05-29
-- update date: 2019-05-29
-- description: 动态为表添加存储时间字段
-- =============================================
create procedure [dbo].[usp_dyanmicallyaddstoragedatetimefield]
(
@table_catalog sysname,
@table_schema sysname,
@table_name sysname,
@columns nvarchar(max) -- '[column1],[column2],[column3]...'
)
as
begin
declare @source table ([id] int identity(1,1), [value] nvarchar(max))
insert into @source ([value]) select [value] from [dbo].[tvf_convertstringtotable](@columns,',')
declare @r int = 1,@rs int = 0
select @rs = max([id]) from @source
while @r <= @rs
begin
declare @column_name sysname
select @column_name = convert(varchar(30), [value], 23) from @source where [id] = @r
execute('if [dbo].[usp_isexistscolumn]('''+ @table_catalog +''','''+ @table_schema +''','''+ @table_name +''','''+ @column_name +''') = 0 alter table '+ @table_name +' add '+ @column_name +' datetime')
set @r= @r + 1
end
end
上面存储过程代码#54行中有一个定义函数:[dbo].[tvf_convertstringtotable]()
是分割字符串转为表。函数详细代码参考这篇《展开中断或忽略的序号》
还有一个自定义函数:[dbo].[usp_isexistscolumn]()这是判断表的列是否存在。
参考:《判断列名是否存在》
接下来,insus.net演示这个存储过程[dbo].[usp_dyanmicallyaddstoragedatetimefield]:
if object_id('tempdb..#temprpt') is not null drop table #temprpt
create table #temprpt
(
[caseno] bigint,
[username] nvarchar(20)
)
execute [dbo].[usp_dyanmicallyaddstoragedatetimefield] 'tempdb','dbo','#temprpt','[column1],[column2],[column3]'
select * from #temprpt