2016-02-19 41 views
0

我有以下查询可提取某些列数据,并提取列中2 xml标记之间的所有内容。TSQL在where子句中提取列数据

Use Database 
DECLARE @First VARCHAR(15), @Second VARCHAR(15) 
SET @First = '<InstrumentID>' 
SET @Second = '</InstrumentID>' 

SELECT out_interface_id, msg_id , 
SUBSTRING(xml_msg, CHARINDEX(@First, xml_msg) + LEN(@First), 
    CHARINDEX(@Second, xml_msg) - 
    CHARINDEX(@First, xml_msg) - 
    LEN(@First)) as InstrumentID, 
msg_type, xml_msg, CAST(xml_msg AS XML) as [Quick_XML], 
date_received,status, last_modified, environment, 
transaction_closed_date 
from Table1 with (nolock) 
where msg_type in ('BALMIS','ACCTV21') 
and date_received >= CAST(GETDATE() -1 as DATE) 
and date_received < CAST(GETDATE() as DATE) 
order by date_received desc 

现在,我希望能够添加到WHERE子句:和InstrumentID =“ABC123”

这应该是简单的,但我无法弄清楚。

回答

1

您可以很容易地做到这一点。并小心投掷,提示NOLOCK提示。它给大家带来了比大多数人意识到的更多的问题。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/

select * 
from 
(
    SELECT out_interface_id, msg_id , 
    SUBSTRING(xml_msg, CHARINDEX(@First, xml_msg) + LEN(@First), 
     CHARINDEX(@Second, xml_msg) - 
     CHARINDEX(@First, xml_msg) - 
     LEN(@First)) as InstrumentID, 
    msg_type, xml_msg, CAST(xml_msg AS XML) as [Quick_XML], 
    date_received,status, last_modified, environment, 
    transaction_closed_date 
    from Table1 with (nolock) 
    where msg_type in ('BALMIS','ACCTV21') 
    and date_received >= CAST(GETDATE() -1 as DATE) 
    and date_received < CAST(GETDATE() as DATE) 
) x 
where x.InstrumentID = 'ABC123' 
order by date_received desc 
0

您不能在WHERE子句中引用SELECT列表中的别名。您将需要重新创建相同的字符串结果在您的SELECT列表中使用相同的庄园:

Use Database 
DECLARE @First VARCHAR(15), @Second VARCHAR(15) 
SET @First = '<InstrumentID>' 
SET @Second = '</InstrumentID>' 

SELECT out_interface_id, msg_id , 
SUBSTRING(xml_msg, CHARINDEX(@First, xml_msg) + LEN(@First), 
    CHARINDEX(@Second, xml_msg) - 
    CHARINDEX(@First, xml_msg) - 
    LEN(@First)) as InstrumentID, 
msg_type, xml_msg, CAST(xml_msg AS XML) as [Quick_XML], 
date_received,status, last_modified, environment, 
transaction_closed_date 
from Table1 with (nolock) 
where msg_type in ('BALMIS','ACCTV21') 
and date_received >= CAST(GETDATE() -1 as DATE) 
and date_received < CAST(GETDATE() as DATE) 
and SUBSTRING(xml_msg, CHARINDEX(@First, xml_msg) + LEN(@First), 
    CHARINDEX(@Second, xml_msg) - 
    CHARINDEX(@First, xml_msg) - 
    LEN(@First)) = 'ABC123' 
order by date_received desc; 

此外,使用XML处理时,它可能是更好地与它的工作为XML,而不是作为一个字符串。在这种情况下,我更熟悉Oracle,但是这里有一个涉及这个主题的SO条目:Parse XML in SQL Server