需要: 从“评论类型”文本/备注字段中获取数据,并在插入记录时将其放入单独的字段中。为了简单起见,以下示例使用字段 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)
);
关于SQL Server 插入触发器改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47929126/