在多个记录中查询XML

时间:2014-11-04 15:08:06

标签: sql sql-server xml dynamics-crm

我正在使用Dynamics Business Portal。在尝试使用用户的AD用户名加入GP Dynamics EmployeeID时,我发现了一些可帮助我创建此哈希的表。我可以在Business Portal表中找到的唯一一个将业务门户绑定到GP的表称为[MbfRoleUser]。足够的背景故事,这里有一些示例数据以及我希望如何显示它。

declare @table table(UserID varchar(50),Constituent varchar(200))
insert into @table values
('D8851830-EF23-44BE-BB17-0008D70F9F5B','<entityKey><Microsoft.Dynamics.Common.Company.Company ID="1" /><Microsoft.Dynamics.Hrm.Entity.Employee ID="002001" /></entityKey>')
,('78E42A10-D7CE-4B40-86F2-001549F5A3C2','<entityKey><Microsoft.Dynamics.Common.Company.Company ID="1" /><Microsoft.Dynamics.Hrm.Entity.Employee ID="001079" /></entityKey>')
,('1F899A87-6186-4E2B-BA18-0076A4D95836','<entityKey><Microsoft.Dynamics.Common.Company.Company ID="1" /><Microsoft.Dynamics.Hrm.Entity.Employee ID="001997" /></entityKey>')
,('CB043358-0B16-4055-A806-00A63964C1A9','<entityKey><Microsoft.Dynamics.Common.Company.Company ID="1" /><Microsoft.Dynamics.Hrm.Entity.Employee ID="001557" /></entityKey>')
,('3EF8C35D-6227-486A-B86B-00BD5991E188','<entityKey><Microsoft.Dynamics.Common.Company.Company ID="1" /><Microsoft.Dynamics.Hrm.Entity.Employee ID="001740" /></entityKey>')

select * from @table

我想要的输出是:

 UserID                                CompanyID    Employeeid
----------                             ----------   ----------
D8851830-EF23-44BE-BB17-0008D70F9F5B   1            002001
78E42A10-D7CE-4B40-86F2-001549F5A3C2   1            001079
1F899A87-6186-4E2B-BA18-0076A4D95836   1            001997
CB043358-0B16-4055-A806-00A63964C1A9   1            001557
3EF8C35D-6227-486A-B86B-00BD5991E188   1            001740

如果可能的话,我想在不使用子字符串的情况下这样做。是的,它可能适用于这个例子,但其他情况可能会出现更复杂的xml,我想学习如何做正确。

最后,我将加入表[MbfUserWindowsIdentity],其中包含domain \ username格式的AD用户名以及另一个包含UserID的列。

如果有人知道拉一个EmployeeID的更好的地方,那也会有用。基本上我们只需要使用AD用户名导出GP EmployeeID。

对于那些好奇的人,我们正在使用GP中的数据构建员工目录,但该目录将具有允许用户选择不发布选择个人信息的功能,因此与AD相关联。

1 个答案:

答案 0 :(得分:2)

首先,施放&#34;成分&#34;字段为XML - 在Dynamics / GP数据库中,此字段数据类型为NVARCHAR。 然后,使用Xquery从XML字段中提取值。见下面的例子:

SELECT UserID 
,CAST(t.Constituent AS XML).value('(/entityKey/Microsoft.Dynamics.Common.Company.Company/@ID)[1]','int') as CompanyID
,CAST(t.Constituent AS XML).value('(/entityKey/Microsoft.Dynamics.Hrm.Entity.Employee/@ID)[1]','varchar(10)') as EmployeeID
FROM @table as t

要回答问题的其他部分,这是我找到的唯一一个将EmployeeId与userid存储在同一个表中的地方。

我希望这有帮助!