用于插入的SQL Server触发器,新手
我有一个从Autocad图形中提取的数据填充的数据库。数据非常有限,因此我需要从从用于插入的SQL Server触发器,新手,sql,sql-server,database-trigger,Sql,Sql Server,Database Trigger,我有一个从Autocad图形中提取的数据填充的数据库。数据非常有限,因此我需要从从DWG\u NUMBER列中引入的字符串文本中提取值,并从DWG\u NUMBER填充同一表格中其他空白列中的值 我知道我需要在插入过程中使用触发器来执行此操作。我很难弄清楚怎么做。我可以通过查询来完成我想做的事情,有人能给我一些帮助吗 以下是我所拥有的: 数据库表=ID\u标记 包含需要提取的数据的列有=DWG\u NUMBER,IDNUMBER,DESCRIPTION 我需要填充的列是作业编号,二维码 以下
DWG\u NUMBER
列中引入的字符串文本中提取值,并从DWG\u NUMBER
填充同一表格中其他空白列中的值
我知道我需要在插入过程中使用触发器来执行此操作。我很难弄清楚怎么做。我可以通过查询来完成我想做的事情,有人能给我一些帮助吗
以下是我所拥有的:
- 数据库表=ID\u标记
- 包含需要提取的数据的列有=
,DWG\u NUMBER
,IDNUMBER
DESCRIPTION
- 我需要填充的列是
,作业编号
二维码
如果要使用触发器执行此操作,请尝试以下代码:
CREATE TRIGGER trgIDTagInsert
ON dbo.ID_TAG
AFTER INSERT
AS
BEGIN
UPDATE dbo.ID_TAG t1
SET JOB_NUMBER = LEFT(RIGHT(i.DWG_NUMBER, LEN(i.DWG_NUMBER) -2), LEN(i.DWG_NUMBER) - 4),
QRCODE = CONCAT(LEFT(RIGHT(i.DWG_NUMBER, LEN(i.DWG_NUMBER) - 2), LEN(i.DWG_NUMBER) - 4), '|', i.IDNUMBER, '|', i.DESCRIPTION)
FROM Inserted i
END
基本上,您可以在表(ID\u标记
)和给定操作(此处:INSERT
)上定义触发器
接下来,您需要了解触发器被称为每语句一次——而不是每行一次——因此,如果有一个INSERT
语句一次插入20行,则触发器只被称为一次——但伪表Inserted
将包含所有这20行新行(使用与“基本”表完全相同的列)
因此,您需要抓取插入的Inserted
并获取插入的值,然后您可以根据插入的行中的列,通过设置JOB\u NUMBER
和QRODE
列来更新基表ID\u标记
这段代码通过一个基于集的操作来完成整个更新,应该非常好而且快速。你要不惜一切代价避免触发器中的游标和while循环
正如@LaughingVergil所提到的:您还可以将这两列定义为表中的计算列列,它将自动为您插入的每一行计算,而不需要触发器
只需将以下两条语句添加到表创建脚本中:
ALTER TABLE dbo.ID_Tag
ADD Job_Number AS LEFT(RIGHT(DWG_NUMBER, LEN(DWG_NUMBER) -2), LEN(DWG_NUMBER) - 4) PERSISTED;
ALTER TABLE dbo.ID_Tag
ADD QR_Code AS CONCAT(LEFT(RIGHT(DWG_NUMBER, LEN(DWG_NUMBER) - 2), LEN(DWG_NUMBER) - 4), '|', [IDNUMBER], '|', [DESCRIPTION]) PERSISTED;
现在您有了两个新的计算列(您不能自己在其中插入任何值-您还需要始终为插入定义列列表,并从列列表中忽略这两个)这将始终是最新的,并包含所需的值您不一定要在触发器中提取数据。您可以改为计算这两列。这样,如果有人手动修改SQL Server中的一列,更改将反映在您的列中,而不做任何更改。请查看(六篇文章)有关计算列的问题和答案。感谢您的回复,我以前从未使用过脚本。如何访问现有表上的“表创建脚本”?
ALTER TABLE dbo.ID_Tag
ADD Job_Number AS LEFT(RIGHT(DWG_NUMBER, LEN(DWG_NUMBER) -2), LEN(DWG_NUMBER) - 4) PERSISTED;
ALTER TABLE dbo.ID_Tag
ADD QR_Code AS CONCAT(LEFT(RIGHT(DWG_NUMBER, LEN(DWG_NUMBER) - 2), LEN(DWG_NUMBER) - 4), '|', [IDNUMBER], '|', [DESCRIPTION]) PERSISTED;