我从xml中选择,将属性解析为如下列:
Observable.combineLatest(validEmail, validPw, (b1, b2) -> b1 && b2)
.subscribe(enableButton -> /* enable button based on bool */);
是否可以直接从declare @xml xml
select @xml = xml_Function()
SELECT
Tab.Col.value('@fieldOne','varchar(20)') AS fieldOne,
Tab.Col.value('@fieldTwo','varchar(20)') AS fieldTwo
FROM @xml.nodes('/row') Tab(Col)
进行选择而不将结果复制到xml_Function
变量中?
类似的东西:
@xml
答案 0 :(得分:1)
据我所知,您无法直接使用nodes()
的XML返回功能,但您可以使用CTE或"子选择"让它内联:
CREATE FUNCTION dbo.ComeBackAsXML(@XmlText VARCHAR(MAX))
RETURNS XML
AS
BEGIN
DECLARE @x XML=CAST(@XmlText AS XML);
RETURN @x;
END
GO
DECLARE @xText VARCHAR(MAX)=
'<root>
<item id="3">
<a attr="test1" />
<a attr="test2" />
<a attr="test3" />
</item>
<item id="5">
<a attr="test1" />
<a attr="test2" />
</item>
</root>';
WITH GetXml AS (SELECT dbo.ComeBackAsXml(@xText) AS AsXml)
SELECT item.value('@id','int') AS ItemID
,a.value('@attr','varchar(max)') AS a_Attr
FROM GetXml
CROSS APPLY GetXml.AsXml.nodes('/root/item') AS One(item)
CROSS APPLY One.item.nodes('a') AS The(a);
GO
DROP FUNCTION dbo.ComeBackAsXML;
GO
这是CTE的子选择:
SELECT item.value('@id','int') AS ItemID
,a.value('@attr','varchar(max)') AS a_Attr
FROM (SELECT dbo.ComeBackAsXml(@xText)) AS GetXml(AsXml)
CROSS APPLY GetXml.AsXml.nodes('/root/item') AS One(item)
CROSS APPLY One.item.nodes('a') AS The(a);
如果你想让函数可参数化,你必须要知道,你写入XPath表达式的东西 - 几乎在所有情况下 - 都是文字,因此不能参数化......
我认为,你不想要一个通用的通用&#34; XML函数处理您可能需要的任何未知结构。我假设有一个给定的XML总是相同的,你只想简短地编写你的查询:
你有几种方法可以去
WHERE
sql:parameter()
在这里,您将找到每种方法的示例:
CREATE FUNCTION dbo.ParseXML(@xml XML)
RETURNS TABLE
AS
RETURN
SELECT item.value('@id','int') AS ItemID
,a.value('@attr','varchar(max)') AS a_Attr
FROM @xml.nodes('/root/item') AS One(item)
CROSS APPLY One.item.nodes('a') AS The(a);
GO
DECLARE @x XML=
'<root>
<item id="3">
<a attr="test1" />
<a attr="test2" />
<a attr="test3" />
</item>
<item id="5">
<a attr="test1" />
<a attr="test2" />
</item>
</root>';
SELECT * FROM dbo.ParseXML(@x)
WHERE ItemID=3
GO
ALTER FUNCTION dbo.ParseXML(@xml XML,@ItemID INT)
RETURNS TABLE
AS
RETURN
SELECT item.value('@id','int') AS ItemID
,a.value('@attr','varchar(max)') AS a_Attr
FROM @xml.nodes('/root/item[@id=sql:variable("@ItemID")]') AS One(item)
CROSS APPLY One.item.nodes('a') AS The(a);
GO
DECLARE @x XML=
'<root>
<item id="3">
<a attr="test1" />
<a attr="test2" />
<a attr="test3" />
</item>
<item id="5">
<a attr="test1" />
<a attr="test2" />
</item>
</root>';
SELECT * FROM dbo.ParseXML(@x,5);
GO
CREATE PROCEDURE dbo.ParseXMLDynamically(@xml XML,@ItemID INT)
AS
BEGIN
DECLARE @SqlCmd NVARCHAR(MAX)=
'SELECT item.value(''@id'',''int'') AS ItemID
,a.value(''@attr'',''varchar(max)'') AS a_Attr
FROM @xml.nodes(''/root/item[@id=' + CAST(@ItemID AS VARCHAR(100)) + ']'') AS One(item)
CROSS APPLY One.item.nodes(''a'') AS The(a)';
EXECUTE sp_executesql @SqlCmd,N'@xml XML',@xml;
END
GO
DECLARE @x XML=
'<root>
<item id="3">
<a attr="test1" />
<a attr="test2" />
<a attr="test3" />
</item>
<item id="5">
<a attr="test1" />
<a attr="test2" />
</item>
</root>';
EXEC dbo.ParseXMLDynamically @x, 5;
GO
DROP PROCEDURE dbo.ParseXMLDynamically;
DROP FUNCTION dbo.ParseXML;