求一个 触发器,在数据库里自动生成TimeTamp的触发器

时间:2022-11-25 21:28:10


数据库中有一个字段为TimesTamp,我希望插入一个触发器可以自动插入TimesTamp。

TimesTamp的格式为nvchar(20),希望是一个由日期转换成的数字。

TimesTamp的格式:2014-1-1 10:20:30 就转换成 20140101102030。

如果这个TimesTamp在库中已经存在,则在最后+1 ,以上列为列值为 20140101102031

直至 这个TimesTamp 在数据库中保持唯一性。

10 个解决方案

#1


declare @TimesTamp varchar(20)
set @TimesTamp='2014-1-1 10:20:30'
set @TimesTamp=replace(@TimesTamp,':','')
set @TimesTamp=replace(@TimesTamp,'-1','01')
set @TimesTamp=replace(@TimesTamp,'-2','02')
set @TimesTamp=replace(@TimesTamp,'-3','03')
set @TimesTamp=replace(@TimesTamp,'-4','04')
set @TimesTamp=replace(@TimesTamp,'-5','05')
set @TimesTamp=replace(@TimesTamp,'-6','06')
set @TimesTamp=replace(@TimesTamp,'-7','07')
set @TimesTamp=replace(@TimesTamp,'-8','08')
set @TimesTamp=replace(@TimesTamp,'-9','09')
set @TimesTamp=replace(@TimesTamp,' ','')
if(@TimesTamp='20140101102030')
begin
set @TimesTamp= LTrim(cast (@TimesTamp as numeric(20,0))+1)
end
print @TimesTamp

#2


这个完全可以不用触发器 直接用函数或者过程就搞定了吧。

#3


大哥!!

TimesTamp 是将 now 转换成 一个数字的字符串。

然后判断 是否在库中存在。 

您这一群的替换,是不是还忘记了 (:) ?

难道不是用 year,month,day,HHmmss 这个样子转换的?

begin
set @TimesTamp= LTrim(cast (@TimesTamp as numeric(20,0))+1)
end

不用现在数据库中找一下?

俺没搞过触发器这种东西,想学习一下,但这个不合逻辑吧。

#4


学习一下触发器嘛,

否则直接在程序中完成了,不用放在数据库里。

#5


提醒一下 LZ ,你这个逻辑欠佳。

2014-1-1 10:20:30 就转换成 20140101102030。

第一秒写入了 2 行数据 
20140101102030 , 20140101102031 

第二秒,再要写数据,这个号就被占用了。。。

#6


恩,其实没有写入,只是为了生成一个能转换回来的时间戳.


代码里可以完成,触发器不太会用.

#7


奇怪的要求。
既然代码里能完成,直接复制到触发器中就行了,一样的。

#8


不一样啊不一样,

我的代码是VB.NET 或者是C#

复制到SqlServer中大大地不能运行.

#9


感觉你保存成字符串形式,还不如保存成  decimal(21, 12)  之类格式了

#10




 
create function [dbo].[dtdecimal](@datetime datetime) 
returns nvarchar(20)
as
begin
  declare @res nvarchar(20)
  declare @tmp nvarchar(20)

  set @res = convert(nvarchar(20), @datetime, 21)
  set @res=replace(@res,'-','')
  set @res=replace(@res,':','')
  set @res=replace(@res,' ','')
  set @res=replace(@res,'.','')

  if (select @tmp = max(主键名) from 表 where 主键名 like ''@res'%''') is not null
    set @res = @tmp + '1' 
  returns @res 
end






#1


declare @TimesTamp varchar(20)
set @TimesTamp='2014-1-1 10:20:30'
set @TimesTamp=replace(@TimesTamp,':','')
set @TimesTamp=replace(@TimesTamp,'-1','01')
set @TimesTamp=replace(@TimesTamp,'-2','02')
set @TimesTamp=replace(@TimesTamp,'-3','03')
set @TimesTamp=replace(@TimesTamp,'-4','04')
set @TimesTamp=replace(@TimesTamp,'-5','05')
set @TimesTamp=replace(@TimesTamp,'-6','06')
set @TimesTamp=replace(@TimesTamp,'-7','07')
set @TimesTamp=replace(@TimesTamp,'-8','08')
set @TimesTamp=replace(@TimesTamp,'-9','09')
set @TimesTamp=replace(@TimesTamp,' ','')
if(@TimesTamp='20140101102030')
begin
set @TimesTamp= LTrim(cast (@TimesTamp as numeric(20,0))+1)
end
print @TimesTamp

#2


这个完全可以不用触发器 直接用函数或者过程就搞定了吧。

#3


大哥!!

TimesTamp 是将 now 转换成 一个数字的字符串。

然后判断 是否在库中存在。 

您这一群的替换,是不是还忘记了 (:) ?

难道不是用 year,month,day,HHmmss 这个样子转换的?

begin
set @TimesTamp= LTrim(cast (@TimesTamp as numeric(20,0))+1)
end

不用现在数据库中找一下?

俺没搞过触发器这种东西,想学习一下,但这个不合逻辑吧。

#4


学习一下触发器嘛,

否则直接在程序中完成了,不用放在数据库里。

#5


提醒一下 LZ ,你这个逻辑欠佳。

2014-1-1 10:20:30 就转换成 20140101102030。

第一秒写入了 2 行数据 
20140101102030 , 20140101102031 

第二秒,再要写数据,这个号就被占用了。。。

#6


恩,其实没有写入,只是为了生成一个能转换回来的时间戳.


代码里可以完成,触发器不太会用.

#7


奇怪的要求。
既然代码里能完成,直接复制到触发器中就行了,一样的。

#8


不一样啊不一样,

我的代码是VB.NET 或者是C#

复制到SqlServer中大大地不能运行.

#9


感觉你保存成字符串形式,还不如保存成  decimal(21, 12)  之类格式了

#10




 
create function [dbo].[dtdecimal](@datetime datetime) 
returns nvarchar(20)
as
begin
  declare @res nvarchar(20)
  declare @tmp nvarchar(20)

  set @res = convert(nvarchar(20), @datetime, 21)
  set @res=replace(@res,'-','')
  set @res=replace(@res,':','')
  set @res=replace(@res,' ','')
  set @res=replace(@res,'.','')

  if (select @tmp = max(主键名) from 表 where 主键名 like ''@res'%''') is not null
    set @res = @tmp + '1' 
  returns @res 
end