Sql server 使用OPENJSON向插入的记录添加值的触发器
Azure SQL Server 2019-我无法使触发器正常工作: 该表名为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列来填充。我用于返回显示此
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格式错误。当删除代码时,您能更具体地解释一下“您的代码似乎正常工作”的含义吗?你是说扳机完成了我的任务?如果是这样的话,你能用你发现的有用的东西来创造一个答案吗?谢谢