我有两个select语句,它们都包含一个从数据库表派生的子串。它们是从varchar派生的子字符串,它应该是一个XML,但是保存为varcars,因为它们可能格式不正确并且可能无效。
我正在尝试获取导致第一个查询的表,一个包含50个Varchars的列表,并使用第二个查询搜索数据库。如果我在第一个查询中使用每一行并附加一个字符串来获取节点,我可以从每个SQLmessageID获得0到n个SQLRelatesMessageID集(" z4480"这里是一个示例)。
我已经尝试了一个游标实现,但是性能让我不知所措。如果您尝试使用as别名给substring列,则Join不起作用。我应该采取哪些步骤来获取SQLRelatesMessageID的整体列表。我的目标是在给定NCPDPID的情况下获取所有MessageLogId(图中的3个)。
我正在使用SQL Server Manager 2012.
--1--Recieves a list based on a given NCPDPID node Value
select substring(m.message, charindex('<MessageID>', m.message)+11, charindex('</MessageID>', m.message)-charindex('<MessageID>', m.message)-11) as
SQLmessageID from messagelog m where message like '%<NCPDPID>'+'1234567'+'</NCPDPID>%'
--2--Selects messageID from top select and searches RelatesToMessageID node
select substring(r.message, charindex('<RelatesToMessageID>', r.message)+20, charindex('</RelatesToMessageID>', r.message)-charindex('<RelatesToMessageID>', r.message)-20) as SQLRelatesMessageID, * from messagelog r
where message like ('%<RelatesToMessageID>'+'z4480'+'</RelatesToMessageID>%')
答案 0 :(得分:0)
这适用于这个答案。
---main
SELECT * FROM
(
select substring(m.message, charindex('<MessageID>', m.message)+11, charindex('</MessageID>', m.message)-charindex('<MessageID>', m.message)-11) as SQLmessageID from messagelog m
where message like '%<NCPDPID>1234567</NCPDPID>%' and dateTime > '3/01/2016'
) a JOIN
(
select
substring(r.message, charindex('<RelatesToMessageID>', r.message)+20, charindex('</RelatesToMessageID>', r.message)-charindex('<RelatesToMessageID>', r.message)-20) as SQLRelatesMessageID,
message,
messagelogid from messagelog r
where
dateTime > '3/01/2016' AND
message LIKE ('%<RelatesToMessageID>%</RelatesToMessageID>%')
) b ON b.SQLRelatesMessageID = a.SQLmessageID