zoukankan      html  css  js  c++  java
  • SQL——触发器——插入触发器——边学边项目写的。

    需求:

    项目表项目编码触发器编写

    为项目表DwProject编写触发器,目的为当创建新项目时,且ProjectNo

    为Null或空字符串时,自动创建项目编号,编号格式为4位年号,2位月份,2位顺序号,如20160301。具体要求如下:

    1、触发器名称Tig_Project_Number。

    2、仅Insert时触发。

    3、触发器前6位为GetDate取值当前年和月,如201603,后两位为当前月的最后一个项目顺序号 1。

    4、暂不考虑批量插入,不使用游标。

    5、首先在192.168.1.113编写及测试,确定没问题后审核并部署在114服务器。

    触发器编写完成后将现有所有项目编号重新按照触发器定义的格式重新编码。

    ALTER trigger [dbo].[Tig_Project_Number]
    on [dbo].[DwProject] after insert --插入类型
    as
    --声明4个变量
    DECLARE @Title varchar(6) 
    DECLARE @dateYm varchar(20)
    DECLARE @TitleNumber varchar(8)
    DECLARE @TitleSessess varchar(8)
    SET @dateYm=  CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112)--得到格式为20160101的时间。
    SET @Title =  SUBSTRING(@dateYm, 1, 6)--字符串截取1-6个(非从0开始)
    set @TitleNumber=(select Max(ProjectNo) from DwProject where ProjectNo like @Title+'%')--取出已有最大编号,如果没有为空。
    --如果插入为空或者NULL。
    if((select ProjectNo from inserted)='' or (select ProjectNo from inserted)is NULL)
    begin
    --如果查询到历史编码—————历史编码+1
    if(len(@TitleNumber)>6 and @TitleNumber is not null )
    begin
     set @TitleSessess=(select convert(int,@TitleNumber)+1)
    end
    else --否则直接用 201612 格式 + 第一个顺序号 01
    begin
    Set @TitleSessess=@Title+'01'
    end
     update DwProject set ProjectNo=@TitleSessess where Id=(select Id from inserted)
    end--如果插入为空或者NULL。结束标记。
    

     修改版

    ALTER TRIGGER [dbo].[Tig_Project_Number]
    ON [dbo].[DwProject] AFTER INSERT --插入类型
    AS
    --声明4个变量
    DECLARE @Title VARCHAR(6) 
    DECLARE @dateYm VARCHAR(20)
    DECLARE @TitleNumber VARCHAR(8)
    DECLARE @TitleSessess VARCHAR(8)
    	SET @dateYm=  CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112)--得到格式为20160101的时间。
    	SET @Title =  SUBSTRING(@dateYm, 1, 6)--字符串截取1-6个(非从0开始)
    	SET @TitleNumber=(SELECT Max(ProjectNo) FROM DwProject WHERE ProjectNo like @Title+'%')--取出已有最大编号,如果没有为空。
    --如果插入为空或者NULL。
    	IF((SELECT ProjectNo FROM inserted)='' or (SELECT ProjectNo FROM inserted)is NULL)
    		BEGIN
    			--如果查询到历史编码—————历史编码+1
    			IF(len(@TitleNumber)>6 and @TitleNumber is not null )
    				SET @TitleSessess=(SELECT convert(int,@TitleNumber)+1)
    			--否则直接用 201612 格式 + 第一个顺序号 01
    			ELSE
    				SET @TitleSessess=@Title+'01'
    		UPDATE DwProject SET ProjectNo=@TitleSessess WHERE Id=(SELECT Id FROM inserted)
    		END--如果插入为空或者NULL。结束标记。
    

      心得:格式化了一下,去掉了单行的 BEGIN END 

  • 相关阅读:
    品尝阿里云容器服务:负载均衡与容器的关系
    基于微服务架构、运行于容器中的.NET Core示例应用eShopOnContainers
    基于VS2017的Docker Support体检ASP.NET Core站点的Docker部署
    用工厂模式解决ASP.NET Core中依赖注入的一个烦恼
    终于知道什么情况下需要实现.NET Core中的IOptions接口
    ASP.NET Core Web API处理HttpResponseMessage类型返回值的问题
    ASP.NET Core奇遇记:无用户访问,CPU却一直100%
    省一行是一行:在if语句中使用C# 7.0的模式匹配
    ASP.NET Core 2.0 Preview 1 中贴心的新特性
    .NET Core类库项目中如何读取appsettings.json中的配置
  • 原文地址:https://www.cnblogs.com/blogs2014/p/5306447.html
Copyright © 2011-2022 走看看