0

我正在应用 XML 交叉应用以通过使用存储过程从具有多个节点的 XML 项目文件中提取数据。
存储过程如下

INSERT INTO UCDetails
SELECT 
Usecase.value('@UserID','VARCHAR(100)') AS UCId, --ATTRIBUTE 
Usecase.value('@Name','VARCHAR(100)') AS UCName, --ATTRIBUTE 
Usecase.value('@PmAuthor','VARCHAR(100)') AS UCActor, --ATTRIBUTE 
UCPrecon.value('@Value','VARCHAR(MAX)') AS UCPre, --ATTRIBUTE 
UCPostcon.value('@Value','VARCHAR(MAX)') AS UCPost, --ATTRIBUTE 


FROM
@xml.nodes('/Project/Models/UseCase')AS TAB(Usecase) OUTER  
apply @xml.nodes('/Project/Models/UseCase/TaggedValues/TaggedValueContainer/ModelChildren/TaggedValue[5] ')AS TAB1(UCPrecon)OUTER  
apply @xml.nodes('/Project/Models/UseCase/TaggedValues/TaggedValueContainer/ModelChildren/TaggedValue[6]')AS TAB2(UCPostcon)

END

而不是只得到一行数据,我得到的是交叉乘法行,如下所示

UCId UCName UCActor UCPre UCPost        
 UC01 登录 Bilal Haider 用户必须已注册 用户已成功登录      

UC01 登录 Bilal Haider 用户必须注册 用户已添加   

UC01 Login Bilal Haider 用户登录成功 用户登录成功    

UC01 Login Bilal Haider 用户登录成功 用户已添加   

UC02 添加用户 Bilal Haider 用户必须注册 用户登录成功   

UC02 添加用户 Bilal Haider 用户必须已注册 添加用户  

UC02 添加用户 Bilal Haider 用户登录成功 用户登录成功    

UC02 添加用户 Bilal Haider 用户登录成功 用户添加

很抱歉发布这样的结果正确的行以粗体突出显示,但为什么我得到所有其他行?

XML 文件链接: XML 文件

4

1 回答 1

1

不要对TaggedValues. 请改为在 values 子句中指定 xPath。

select T.X.value('@UserID', 'varchar(100)'),
       T.X.value('@Name', 'varchar(100)'),
       T.X.value('@PmAuthor', 'varchar(100)'),
       T.X.value('(TaggedValues/TaggedValueContainer/ModelChildren/TaggedValue)[5]/@Value', 'varchar(max)'),
       T.X.value('(TaggedValues/TaggedValueContainer/ModelChildren/TaggedValue)[6]/@Value', 'varchar(max)')
from @xml.nodes('/Project/Models/UseCase') as T(X)

结果

------ ---------- ------------- ------------------------------ ------------------------------
UC01   Login      Bilal Haider  User must be Registerd         User is Loggined sucessfully
UC02   Add User   Bilal Haider  User is Loggined sucessfully   User is added
于 2015-01-12T10:20:42.347 回答