sql server 2012使用触发器产生流水号并在另一库中创建与流水号有关的表

sql server 2012使用触发器产生流水号并在另一库中创建与流水号有关的表


有时候我们需要创建一个与流水号有关的表格,流水号可以根据日期来创建但我们不想把创建流水号有关的表放到同一个库中可以使用如下方法来创建,触发器笔者作了详细说明复制粘贴即可使用,只需将库名与表名还有字段修改成自已的库名与字段名。谨供参考

下面展示一些 内联代码片

USE [SecondSubjects]--第一个库名
GO
/****** Object:  Trigger [dbo].[TR_Creat17c03xh]    Script Date: 2021/5/9 23:53:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<杏雨>
-- Create date: <202157>
-- Description:	<Create [dbo].[vehicle_17c03]创建唯一备案序号并在[Vehicel_17C28]库创建与序号有关的表>
-- =============================================
CREATE TRIGGER [dbo].[TR_Creat17c03xh]
   ON  [dbo].[vehicle_17c03]
   AFTER INSERT
AS 
BEGIN
DECLARE @year NVARCHAR(10)--DECLARE @month NVARCHAR(10)--DECLARE @str NVARCHAR(10)--字符串变量(用来拼接流水号)
DECLARE @xh NVARCHAR(50)--序号(流水号8位)
DECLARE @xhmax NVARCHAR(50) --最大值
SET @year=DATENAME(yyyy, GETDATE())--获取年
SET @month=DATENAME(mm, GETDATE())--获取月
--SET @day=DATENAME(dd, GETDATE())
SET @str='0000'--赋值(如果想增加序号位数在这里增加零的个数)
SELECT @xhmax=MAX([id]) FROM vehicle_17c03 获取最大值(id为主键自增)
SET @xh=@year+@month+RIGHT(@str+@xhmax,4)--拼接字符串年月(取最右则4位加上id最大值)
UPDATE	vehicle_17c03  SET xh=@xh WHERE id=@xhmax--创建流水号(当有插入操作时更新Xh字段并将流水号更新到xh字段)

DECLARE @tb NVARCHAR(50)--表名称(拼接@qz+@xh)接接原则为表名称不能以数字开头所以加一个固定前缀加流水号以方便将来查找
DECLARE @qz NVARCHAR(50)--表名称前缀
SET @qz ='Vehicel_'	
SET @tb= @qz +@xh--拼接表名称
IF OBJECT_ID( @tb,N'U')IS NULL   --如果表格不存在就创建表格(U:代表用户表缩写是sqlserver定义格式)
BEGIN	
--由于触发器中不允许使用USE [Vehicel_17C28]所以这里将USE[Vehicel_17C28]拼到字符串中
--USE [Vehicel_17C28]第二个库名
EXEC( 'USE [Vehicel_17C28] CREATE TABLE [Vehicel_17C28].[dbo].[' +@tb +']

(
	[id] INT PRIMARY KEY IDENTITY(1,1),
	[xh] VARCHAR(50)  NOT NULL,	
	[jd] DECIMAL(18,8) NOT NULL,	
	[wd] DECIMAL(18,8) NOT NULL,
	[gd] DECIMAL(18,8) NOT NULL)')	
END
END

GO

效果如下图所示在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQL Server 流水号脚本通常用于生成一系列连续的、唯一的编号值,这些编号值可以应用于数据的新记录作为标识符(例如ID)。在 SQL Server ,这可以通过触发器或者存储过程完成。 ### 使用触发器创建流水号 **步骤 1:** 首先,确保目标具有足够的字段来存储流水号。比如: ```sql CREATE TABLE Orders ( OrderId INT IDENTITY(1,1) PRIMARY KEY, CustomerId INT, OrderDate DATETIME, ProductId INT, Quantity INT, Price DECIMAL ); ``` `ORDERID` 字段通过 `IDENTITY(1,1)` 自动生成递增的唯一整数值。 **步骤 2:** 创建一个插入触发器来更新该字段: ```sql CREATE TRIGGER dbo.Trigger_InsertOrder ON Orders AFTER INSERT AS BEGIN UPDATE Orders SET OrderId = MAX(OrderId) + 1 FROM Orders o WHERE EXISTS (SELECT * FROM inserted i WHERE i.CustomerId = o.CustomerId AND i.OrderDate > o.OrderDate) END; ``` 这个触发器会在每次向 `Orders` 插入新记录时运行,并更新 `OrderId` 列,使其保持递增并避免重复。 ### 使用存储过程创建流水号 另一种方法是在应用程序端生成流水号,然后将它插入到数据库。例如,在 SQL Server 使用 T-SQL 创建存储过程: ```sql CREATE PROCEDURE sp_InsertNewOrder AS BEGIN DECLARE @NextOrderId INT; SELECT @NextOrderId = ISNULL(MAX(OrderId), 0) + 1 FROM Orders; -- 插入新订单 INSERT INTO Orders (CustomerId, OrderDate, ProductId, Quantity, Price) VALUES (@customerId, GETDATE(), @productId, @quantity, @price); PRINT 'New order with ID ' + CAST(@NextOrderId AS VARCHAR); END; ``` 在这个例子,存储过程会获取当前最大 `OrderId` 的下一个数值,然后将其用于新插入的行。 ### 相关问题: 1. **如何优化 SQL Server 流水号脚本性能?** - 可以考虑使用索引来加速查询速度,尤其是在大型上。 - 定期检查和维护数据库日志,防止性能瓶颈。 2. **在哪些场景下更适合手动设置流水号而非使用自动增长列?** - 当需要控制特定的业务流程逻辑,如按照日期分组生成流水号。 - 数据安全性需求高,需要对流水号生成有严格的控制。 3. **SQL Server 提供了哪些其他工具或功能用于管理数据流水号?** - SQL Server Management Studio (SSMS) 提供图形化的界面来创建触发器和存储过程。 - 使用系统存储过程,如 `sp_MSforeachtable` 来批量操作多张。 - 考虑集成自动化工具或宏来简化流水号的生成过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杏雨1969

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值