2017-08-15 466 views
0

我有一個類似的SQL表:SELECT值WHERE子句

create table #Temp_xml 
(
ID int not null, 
Name varchar(10) null, 
Step XML null 
) 
truncate table #Temp_xml 
Insert INTO #Temp_xml (ID, Name, Step) Values 
(1, 'Query 1', 
'<LoadData> 
    <Step> 
    <StepName>Step 1</StepName> 
    <StepType>Validation</StepType> 
    <Result>PAST</Result> 
    </Step> 
    <Step> 
    <StepName>Step 2</StepName> 
    <Command>SELECT colA, colB FROM Mytbl</Command> 
    <ID>888</ID> 
    </Step> 
    <Step> 
    <StepName>Step 3</StepName> 
    <Command>Truncate table tblABC</Command> 
    <ID>103</ID> 
    </Step> 
</LoadData>') 


Insert INTO #Temp_xml (ID, Name, Step) Values 
(2, 'Query 2', 
'<LoadData> 
    <Step> 
    <StepName>Step 1</StepName> 
    <StepType>Validation</StepType> 
    <Result>True</Result> 
    <ID>112</ID> 
    </Step> 
    <Step> 
    <StepName>Step 2</StepName> 
    <Command>SELECT colA, colB FROM Mytbl</Command> 
    </Step> 
    <Step> 
    <StepName>Step 3</StepName> 
    <Command>Exec dbo.MyStoredproc</Command> 
    </Step> 
</LoadData>') 
Insert INTO #Temp_xml (ID, Name, Step) Values 
(3, 'Query 3', 
'<LoadData> 
    <Step> 
    <StepName>Step 1</StepName> 
    <StepType>Validation</StepType> 
    <Result>False</Result> 
    </Step> 
    <Step> 
    <StepName>Step 2</StepName> 
    <Command>SELECT colA, colB FROM Mytbl</Command> 
    <ID>666</ID> 
    </Step> 
    <Step> 
    <StepName>Step 3</StepName> 
    <Command>Update tblXyz set colA = ''999'' FROM tbl_test</Command> 
    </Step> 
    <Step> 
    <StepName>Step 4</StepName> 
    <Command>Truncate table tblABC</Command> 
    <ID>678</ID> 
    </Step> 
</LoadData>') 

我需要搜索從#temp_xml用於行具有ID = 678以下查詢列步驟將不會返回數據,因爲 有多個節點。

select * from #Temp_xml 
WHERE step.value('(/LoadData/Step/ID)[1]', 'varchar(max)') = 678 

然而,由於第二次出現的ID,我得到想要的結果:

select * from #Temp_xml 
WHERE step.value('(/LoadData/Step/ID)[2]', 'varchar(max)') = 678 

我的問題是,我怎樣才能使這個搜索更通用,這樣我就不用放在方括號[]中出現 ?

+0

BTW,你應該考慮在臨時表變量表。 –

回答

1

您可以使用帶有XPath查詢的.exist(...)函數。

SELECT * 
FROM #Temp_xml 
WHERE step.exist('/LoadData/Step[ID="678"]') = 1 

...如果你需要一個變量來查詢傳給你可以做這樣的......

DECLARE @id INT = 678;  
SELECT * 
FROM #Temp_xml 
WHERE step.exist('/LoadData/Step[ID=sql:variable("@id")]') = 1; 
+0

謝謝,它的工作。 – SilverFish

+0

@SilverFish,如果這對你有效,那麼投票回答並接受它會很友善......這是SO-way的說法*謝謝* ... – Shnugo