Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于插入的SQL Server触发器,新手_Sql_Sql Server_Database Trigger - Fatal编程技术网

用于插入的SQL Server触发器,新手

用于插入的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 我需要填充的列是作业编号,二维码 以下

我有一个从Autocad图形中提取的数据填充的数据库。数据非常有限,因此我需要从从
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;