我有以下查询返回我需要的信息,但我需要在标量值函数中使用此查询以使用计算列中的返回值。
XML 列位于同一个表中,我需要将“设置”中的值插入到名为“方向”的列中
;WITH XMLNAMESPACES ( 'http://www.w3.org/2001/XMLSchema' AS als )
SELECT
a.a.value('@Settings', 'VARCHAR(50)') AS [Settings]
FROM Base AS X
CROSS APPLY X.BaseXML.nodes('als:Name') a(a)
我正在尝试但没有得到任何结果的功能是
CREATE FUNCTION [dbo].[ChooseRevision](@lineId int) Returns integer As
Begin
Return (WITH XMLNAMESPACES ( 'http://www.w3.org/2001/XMLSchema' AS als )
SELECT
a.a.value('@Settings', 'VARCHAR(50)') AS [Settings]
FROM Base AS X
CROSS APPLY X.BaseXML.nodes('als:Name') a(a)
Where LineId = @lideid
)
End
GO
如何将查询包含在疤痕函数中以用作计算列?
<als:Doc xmlns:als="http://www.w3.org/2001/XMLSchema" SchemaVersion="0.1" Settings="First Test" Title="Recovery Loop">
<als:Base Rev="0" Id="201" />
<als:Number TimeStamp="2013-01-21T15:08:00">
<als:Member Name="Club Run" DirId="123" />
</als:Number>
</als:Doc>
最佳答案
假设每个 XML 值只有一个 als:Name
节点,您可以这样写:
CREATE FUNCTION [dbo].[ChooseRevision](@lineId int)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @r VARCHAR(50);
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema' AS als)
SELECT
@r = BaseXML.value('als:Doc[1]/@Settings', 'VARCHAR(50)')
FROM Base
WHERE LineId = @lineId;
RETURN @r;
END
如果您计划在 dbo.Base 表本身中使用此函数,则应使用此版本:
CREATE FUNCTION [dbo].[ChooseRevision](@xml XML)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @r VARCHAR(50);
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema' AS als)
SELECT @r = @xml.value('als:Doc[1]/@Settings', 'VARCHAR(50)')
RETURN @r;
END
关于sql - 在标量值函数中使用 Xquery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14572013/