2016-02-19 76 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