SELECT值WHERE子句
问题描述:
我有一个类似的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
我的问题是,我怎样才能使这个搜索更通用,这样我就不用放在方括号[]中出现 ?
答
您可以使用带有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
BTW,你应该考虑在临时表变量表。 –