需要 8 个字符形成冗长的 RegKey 路径 - 传递给 LEFT 或 SUBSTRING 的长度参数无效

Need 8 characters form a lengthy RegKey path - Invalid length parameter passed to the LEFT or SUBSTRING

我一直在与一个人合作完成了一种相当巧妙的方法,通过该方法可以提取 SCCM 2012 与内置清单 "Programs and Features" 安装的软件包的信息。最后一部分是从上述过程中已清点的注册表字符串中提取 PACKAGEID。每个字符串看起来像这样(目标“PACKAGEID”以粗体标识: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Mobile Client\Software Distribution\Execution History\System\ LAB00003 \ac80c725-7dc7-11e5-9bc8-000c292d4525

如前所述,我不是这一切背后的天才,但我想了解为什么我会收到以下错误:

消息 537,级别 16,状态 3,第 1 行 传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

来自以下查询:

SELECT 数据类型 0, 关键路径0, 名字0, 值0, ( SELECT SUBSTRING(KeyPath0, LEN(LEFT(KeyPath0, CHARINDEX ('\System\', KeyPath0))) + 1, LEN(KeyPath0) - LEN(LEFT(KeyPath0, CHARINDEX ('\System\', KeyPath0) ))) - LEN(RIGHT(KeyPath0, LEN(KeyPath0) - CHARINDEX ('\', KeyPath0))) - 1) ) 作为 "Package ID" 从 dbo.v_GS_Registry_Values0

我通过 select * 来自 SCCM_Ext 验证了 dbo.v_GS_Registry_Values0 视图中确实有注册键字符串.vex_GS_Registry_Values0 但尽管进行了大量搜索,我简单的 sql 头脑无法理解查询及其对 LEN 和 CHARINDEX 的使用。

完全让自己受这个网站的摆布,希望我不仅能解决这个问题,还能更好地理解为什么会发生这种情况以及查询是如何工作的。

如果我可以提供任何其他信息,请告诉我。

如果您只是想在 \System\ 之后获取下一个字符串,您 SQL 是相当复杂的,您可以这样做:

SELECT left (Y.S, charindex ('\', Y.S) - 1)
from Table1
outer apply (
 select CHARINDEX ('\System\', KeyPath0) as pos
) X
outer apply (
 select substring (KeyPath0, X.pos + 8, 9999) as S
) Y

SQL Fiddle

中的示例

第一个外部应用找到 \System\,第二个获取字符串的其余部分(假设最大路径为 9999 个字符),然后只获取实际 \ 之前的部分 select.