2017-08-15 254 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