SQL Server 插入触发器改进

标签 sql sql-server triggers insert substring

需要: 从“评论类型”文本/备注字段中获取数据,并在插入记录时将其放入单独的字段中。为了简单起见,以下示例使用字段 TimeStamp,但使用插入记录后更新(低效)而不是插入记录时更新。需要在不更新的情况下执行此操作。

解决方案: 以前从未使用过SQL触发器,经过一番哀嚎和咬牙切齿,终于想出了这个东西。它确实有效——但效率非常低。有更好的办法吗?

示例: 想象一个表(Castings),其时间戳字段格式为:“2017-12-10 18:44:54”。插入记录时,会使用时间戳字段上的子字符串通过触发器自动填充字段。在这种情况下,YYYY =“2017”,MM =“12”,DD =“10”,HH =“18”,MN =“44”,SS =“54”。使用名为 SQLBuddy 的触发器。

架构:

ID bigint (Identify Specification YES auto-increment)
TimeStamp char(19)
YYYY char(4)
MM char(2)
DD char(2)
HH char(2)
MN char(2)
SS char(2)

SQL 触发代码:

USE [SERT]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[SQLBuddy] 
   ON  [dbo].[Castings]
   AFTER INSERT
AS
BEGIN
   -- SET NOCOUNT ON added to prevent extra result sets from
   -- interfering with SELECT statements.
   SET NOCOUNT ON;
   UPDATE Castings
   SET YYYY = SUBSTRING(TimeStamp,1,4), MM = SUBSTRING(TimeStamp,6,2), DD = SUBSTRING(TimeStamp,9,2), HH = SUBSTRING(TimeStamp,12,2), MN = SUBSTRING(TimeStamp,15,2), SS = SUBSTRING(TimeStamp,18,2);
   SELECT TOP 1 ID FROM Castings ORDER BY ID DESC
END

最佳答案

最好的选择是完全避免触发器并在表上使用计算列。像这样:

CREATE TABLE YourTable
   (ID bigint IDENTITY (1,1),
    YourDateTime DATETIME,
    dYear as DATEPART(YEAR, YourDateTime),
    dMonth as DATEPART(MONTH, YourDateTime),
    dDay as DATEPART(DAY, YourDateTime),
    dHour as DATEPART(HOUR, YourDateTime),
    dMinute as DATEPART(MINUTE, YourDateTime),
    dSecond as DATEPART(SECOND, YourDateTime)
   );

Click here for SQL Fiddle Example

关于SQL Server 插入触发器改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47929126/

相关文章:

python - 使用 Python 获取 SharePoint 列表

php - 如何在 Cake PHP 3.5 中设置模型之间的关联?

c# - 存储过程参数名称是否必须与从 C# 传递的参数匹配?

sql - 如何在Sql Server中删除没有属性的xml节点

sql-server - 在 Ms Sql Server 2005 中检查约束

java - DISTINCT 不消除重复记录 - 为什么?

sql - 从带有时区列的时间戳中选择匹配日期

sql-server - 您如何判断 SQL 2k5 BCP 在导入失败时提示的是哪个字段?

swift - 为 UNNotificationRequest 检索下一个请求日期和关联的 ID

c# - 有没有办法在 EF4 中定义类似 SQL 触发器的机制?