Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 使用OPENJSON向插入的记录添加值的触发器_Sql Server - Fatal编程技术网

Sql server 使用OPENJSON向插入的记录添加值的触发器

Sql server 使用OPENJSON向插入的记录添加值的触发器,sql-server,Sql Server,Azure SQL Server 2019-我无法使触发器正常工作: 该表名为dbo.MailArchive 各栏分别为: Mail_Id Mail_Sender Mail_Received_DateTime Mail_Subject Mail_Body Status Successful_Actions_Count Page_Load_Count 进入数据库的数据只有前5列的值。我需要触发器来填充其他3列 最后3列将通过解析Mail\u Body字段并将数据分离到3列来填充。我用于返回显示此

Azure SQL Server 2019-我无法使触发器正常工作:

该表名为
dbo.MailArchive

各栏分别为:

Mail_Id
Mail_Sender
Mail_Received_DateTime
Mail_Subject
Mail_Body
Status
Successful_Actions_Count
Page_Load_Count
进入数据库的数据只有前5列的值。我需要触发器来填充其他3列

最后3列将通过解析
Mail\u Body
字段并将数据分离到3列来填充。我用于返回显示此分隔符的记录的语句是:

SELECT j.*
FROM dbo.MailArchive d
CROSS APPLY OPENJSON (CONCAT('{"', REPLACE(REPLACE(d.Mail_Body, ': ', '":"'), CHAR(13) + CHAR(10), '","'), '"}')) 
WITH (
   Status varchar(100) '$.Status',
   Successful_Actions_Count int '$."Successful actions count"',
   Request_Count int '$."Request count"',
) j
这将返回根据需要填充的最后3列

但是我们需要记录以这种方式写入,所以我现在尝试将这种逻辑应用到触发器中。我希望最后3列作为插入每个传入记录的一部分填充

这就是我一直在做的:

CREATE TRIGGER BodyParseTrigger on dbo.MailArchive
AFTER INSERT
AS
BEGIN
  SET NOCOUNT ON

  INSERT INTO dbo.MailArchive (
    Status
    , Successful_Actions_Count
    , Page_Load_Count
  )
  SELECT 
    j.*
  FROM INSERTED
  CROSS APPLY OPENJSON (CONCAT('{"', REPLACE(REPLACE(Mail_Body, ': ', '":"'), CHAR(13) + CHAR(10), '","'), '"}')) 
  WITH (
    Status varchar(100) '$.Status',
    Successful_Actions_Count int '$."Successful actions count"',
    Request_Count int '$."Request count"'
  ) j

  SET NOCOUNT OFF
END
尝试执行此触发器的创建时,我收到以下错误消息:

INSERT语句的select列表包含的项目少于INSERT列表。SELECT值的数量必须与INSERT列的数量匹配

我理解错误的意思-它将
SELECT j.*
语句视为一项,而
INSERT-INTO
语句包含3项。但是我不知道如何正确地编写
selectj.*
部分,使其按要求工作

我测试了它,看看它是否只适用于一个项目:

CREATE TRIGGER [dbo].[BodyParseTrigger] on [dbo].[MailArchive]
AFTER INSERT
AS
BEGIN
  SET NOCOUNT ON

  INSERT INTO dbo.MailArchive (
    Status
  )
  SELECT 
    j.*
  FROM INSERTED
  CROSS APPLY OPENJSON (CONCAT('{"', REPLACE(REPLACE(Mail_Body, ': ', '":"'), CHAR(13) + CHAR(10), '","'), '"}')) 
  WITH (
    Status varchar(100) '$.Status'
  ) j

  SET NOCOUNT OFF
END
这次触发器成功创建,但是,我在任何
INSERT
尝试时都会出现此错误:

JSON文本格式不正确。在位置246处发现意外字符“”

如果您能给我提供正确的语法帮助,我将不胜感激

编辑1:

要求的样品记录(仅包括相关列):

进入数据库的值:

Mail_Id   Mail_Body
1         Status: Completed
          Successful actions count: 106
          Page load count: 105

2         Status: Failed
          Successful actions count: 91
          Page load count: 90

3         Status: Completed
          Successful actions count: 44
          Page load count: 32
触发后记录的外观:

Mail_Id    Mail_Body            Status      Successful_Actions_Count    Page_Load_Count

1          <same as above>      Completed   106                         105
2          <same as above>      Failed      91                          90
3          <same as above>      Completed   40                          44  
邮件\u Id邮件\u正文状态成功\u操作\u计数页面\u加载\u计数
1完成106 105
2次失败91 90
3完成40 44

我们需要查看您在
OPENJSON
语句中使用的一些示例数据,以便提供帮助。我建议只创建一个查询,因为在这个阶段,触发器只是增加了与错误无关的复杂性。示例数据添加到原始帖子中。我不知道为什么,但是从代码中删除
CHAR(13)
似乎是可行的。这很奇怪。CHAR(13)是换行符,它似乎是解析主体所必需的。当我回到我的办公桌上时,我会看一看。Dale,我删除了
CHAR(13)
作为测试,我得到了另一个JSON格式错误。当删除代码时,您能更具体地解释一下“您的代码似乎正常工作”的含义吗?你是说扳机完成了我的任务?如果是这样的话,你能用你发现的有用的东西来创造一个答案吗?谢谢