T-SQL 来自 SP 的拆分响应 header

T-SQL split response header from SP

在我调用存储过程的 T-SQL 脚本中,此存储过程处理 HTTP 请求并返回诸如 HTTP 状态代码、状态文本和响应 headers 之类的内容。

存储过程是我无法编辑的第 3 方 managed/created SP(因为当供应商更新他们的应用程序时,SP 将被覆盖)。所以我必须处理SP的输出。

我在发起 HTTP 调用后收到的响应 header 是所有 header 的完整字符串(由两个空格 ' ' 分隔)。

这是回复header:

Cache-Control: no-cache,no-store,max-age=0  Connection: keep-alive  Date: Thu, 10 Feb 2022 07:46:23 GMT  Transfer-Encoding: chunked  Via: 1.1 <snip>.cloudfront.net (CloudFront)  Content-Type: application/json  Notification-Box-Id: 627ac06d-snip-snip-snip-7ae2cda3f8ae  Notification-Message-Id: c6ef44cd-snip-snip-snip-be196a48751b  X-Envoy-Upstream-Service-Time: 105  Strict-Transport-Security: max-age=31536000;  Content-Security-Policy: default-src 'self'  Strict-Transport-Security: max-age=31536000; includeSubDomains; preload  X-Cache: Miss from cloudfront  X-Amz-Cf-Pop: FRA6-C1  X-Amz-Cf-Id: 61b-snip-snipsnipsnip-vpg==    

我需要从这个字符串中得到两个响应 headers (Notification-Box-Id & Notification-Message-Id) 的值。我试过使用 STRING_SPLIT 但它不接受两个空格(因为 nchar(1))。

我的假设是格式始终相同,因此使用 LEFT()、RIGHT() 和 LEN() 我可能可以让它工作。但这是要走的路吗?有没有其他不那么乱的选项?

这很容易。获取 delimitedSplit8k 的副本。它 returns 项目及其在字符串中的顺序位置。而且速度很快。

DECLARE @x VARCHAR(1000) = 'Cache-Control: no-cache,no-store,max-age=0  Connection: keep-alive  Date: Thu, 10 Feb 2022 07:46:23 GMT  Transfer-Encoding: chunked  Via: 1.1 <snip>.cloudfront.net (CloudFront)  Content-Type: application/json  Notification-Box-Id: 627ac06d-snip-snip-snip-7ae2cda3f8ae  Notification-Message-Id: c6ef44cd-snip-snip-snip-be196a48751b  X-Envoy-Upstream-Service-Time: 105  Strict-Transport-Security: max-age=31536000;  Content-Security-Policy: default-src ''self''  Strict-Transport-Security: max-age=31536000; includeSubDomains; preload  X-Cache: Miss from cloudfront  X-Amz-Cf-Pop: FRA6-C1  X-Amz-Cf-Id: 61b-snip-snipsnipsnip-vpg==    ';

SELECT split.*
FROM
(
  SELECT split.Item, Val = LEAD(split.Item,1) OVER (ORDER BY split.ItemNumber)
  FROM DW.dbo.DelimitedSplit8K(@x, '') AS split
) AS split(Item,ItemValue)
WHERE split.Item LIKE '%Notification-Box-Id%'
 OR   split.Item LIKE '%Notification-Message-Id%';

Returns:

Item                      ItemValue
------------------------- -----------------------------------------
Notification-Box-Id:      627ac06d-snip-snip-snip-7ae2cda3f8ae
Notification-Message-Id:  c6ef44cd-snip-snip-snip-be196a48751b