我一直在和一个家伙一起工作,以完成一种相当巧妙的方法,通过该方法可以提取SCCM 2012与内置清单“程序和功能”相对应的软件包的信息。最后一步是从在上述过程中已列出清单的注册表字符串中提取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函数。

从以下查询:

选择
DataType0,
KeyPath0,
名称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)
)作为“包裹ID”

dbo.v_GS_Registry_Values0

我验证了dbo.v_GS_Registry_Values0视图确实通过SCCM_Ext.vex_GS_Registry_Values0中的select *在其中确实具有reg键字符串,但是尽管进行了大量搜索,但我的简单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个字符),然后在实际选择中仅占下一个\的一部分。

10-06 05:12