Sql OPENJSON-modify语句忽略字符串的第一部分
我们从应用程序接收自动生成的电子邮件,并在电子邮件到达收件箱时将其导出到数据库。该表名为Sql OPENJSON-modify语句忽略字符串的第一部分,sql,json,sql-server,sql-server-2017,Sql,Json,Sql Server,Sql Server 2017,我们从应用程序接收自动生成的电子邮件,并在电子邮件到达收件箱时将其导出到数据库。该表名为dbo.MailArchive 直到最近,电子邮件的正文一直是这样的 状态:已完成 成功行动计数:250 页面加载计数:250 …不同的号码和状态除外页加载计数后空白行上有一个回车。< /强> 这些数据的全部被写入一个名为Mail\u Body的字段,然后我们使用OPENJSON运行以下语句,将这些行解析为记录中自己的列: DECLARE@PI varchar(7)='%[^'+CHAR(13)+CHAR
dbo.MailArchive
直到最近,电子邮件的正文一直是这样的
状态:已完成
成功行动计数:250
页面加载计数:250
…不同的号码和状态除外<注意>页加载计数后空白行上有一个回车。< /强>
这些数据的全部被写入一个名为Mail\u Body
的字段,然后我们使用OPENJSON
运行以下语句,将这些行解析为记录中自己的列:
DECLARE@PI varchar(7)='%[^'+CHAR(13)+CHAR(10)+']%;
选择j.状态,
j、 成功的行动数,
j、 页面加载计数
从dbo.mailm
交叉应用(值(反向(m.Mail\u Body)、PATINDEX(@PI,反向(m.Mail\u Body)))PI(SY,I)
交叉应用(值(反向(填充(PI.SY,1,PI.I.)))S(固定字符串)
交叉应用OPENJSON(CONCAT(“{”,REPLACE(REPLACE(S.FixedString,”:“,”:“),CHAR(13)+CHAR(10),”,“,”),“}”)
带有(状态变量字符(100)“$.Status”,
Successful_Actions_Count int'$“Successful Actions Count”,
页面加载计数int'$.“页面加载计数”')j;
从今天开始,某些电子邮件的正文如下所示:
代理在此运行中未满足定义的成功标准。
状态:已完成
成功行动计数:250
页面加载计数:250
澄清,这是一条新线在顶部,在该行的末尾有一个回车,一个回车在新行和<代码>状态< /代码>行之间的空白行上返回。在这个时候,没有一致的方法来预测哪些电子邮件会使用这一新的行,哪些不会
我如何修改我们的
OPENJSON
语句来表示,如果正文中存在第一行,跳过/忽略它并解析第3行到第5行,否则只需执行上面的操作即可?或者更好地证明它,总是忽略单词Status
?之前的所有内容,因为您的数据有新的前导行和尾随行,我认为一个简单的聚合与string_split()
和交叉应用将比我以前的XML答案和当前的JSON方法更有效
示例
返回
ID Status Action PageCnt
1 Completed 250 250
注意:如果要查看空值,请使用外部应用
ID Status Action PageCnt
1 Completed 250 250