在select语句中调用用户定义函数返回xml数据

时间:2016-05-04 14:45:41

标签: sql-server xml user-defined-functions

我在SQL Server 2012中创建了一个返回XML的用户定义函数。我想在SELECT语句中调用该函数。这可能吗? 当我尝试这样做时,我收到错误:

  

ASSIGNMENT语句中不允许使用FOR XML子句。

我希望SELECT语句返回一组这些命名方法,这些方法在其逻辑中具有其他命名方法的依赖关系。 在主CTE中,我获得了具有依赖关系的最新版本的方法。 UDF通过每个方法的逻辑并返回其中调用的任何方法。所以,我想在SELECT语句中调用UDF并返回依赖方法名称的XML。

该函数可以工作并返回XML数据。这是功能:

ALTER FUNCTION [dbo].[GetCalledMLMs] 
(
    -- Add the parameters for the function here
    @MLM_Txt nvarchar(MAX)
)
RETURNS XML
AS
BEGIN
    -- Declare the return variable here
    DECLARE @CalledMLMs XML
    Declare @MLMTbl table (pos int, endpos int, CalledMLM nvarchar(200))
    --Logic to get the data...

    Select @CalledMLMs = CalledMLM from @MLMTbl FOR XML PATH

    -- Return the result of the function
    RETURN @CalledMLMs

END

这是调用UDF的CTE。

;with cte as
(
select distinct Name, max(ID) as LatestVersion
from MLM_T 
where Logic like '%:= MLM %' and Logic not like '%standard_libs := mlm%'
group by Name
)
select MLM2.Name, LatestVersion, 
dbo.GetCalledMLMs(MLM2.Logic) as CalledMLMs
from cte join MLM_T MLM2 on cte.Name = MLM2.Name 
    and cte.LatestVersion = MLM2.ID
    and MLM2.Active = 1 and MLM2.Status in (3, 4)

运行此查询时,我收到错误,即不允许在赋值语句中使用XML。 有没有办法在SELECT语句中调用一个返回XML数据类型的函数?

2 个答案:

答案 0 :(得分:1)

我通过更改函数来返回表而不是XML来解决问题。 所以它看起来像这样:

FUNCTION [dbo].[GetCalledMLMsTbl] 
(
    -- Add the parameters for the function here
    @MLM_Txt nvarchar(MAX)
)
--RETURNS XML
RETURNS @MLMTbl TABLE
(
    pos int,
    endpos int,
    CalledMLM nvarchar(200)
)
AS
BEGIN
  --logic here
  insert into @MLMTbl (pos, endpos, CalledMLM) Values (@startpos, @endpos, @MLM_name)
RETURN
END

然后我打电话给'来自'选择

中的子句
;with cte as
(
select distinct Name, max(ID) as LatestVersion
from CV3MLM 
where Logic like '%:= MLM %' and Logic not like '%standard_libs := mlm%'
    --and Name not like '%V61_CCC' 
group by Name
)
select MLM2.Name, LatestVersion, C.CalledMLM 
from cte join MLM_tbl MLM2 on cte.Name = MLM2.Name and cte.LatestVersion = MLM2.ID
    and MLM2.Active = 1 and MLM2.Status in (3, 4)
    cross apply dbo.GetCalledMLMsTbl(MLM2.Logic) C
order by MLM2.Name, LatestVersion

答案 1 :(得分:1)

如果要将变量设置为值,则必须使用SET和右侧的标量值。

SELECT @SomeVariable=SomeColumn FROM SomeTable无法使用FOR XML语法(而且相当危险......),因为XML不是SELECT的列,而是之后的选择过程

你的问题就在这里:

Select @CalledMLMs = CalledMLM from @MLMTbl FOR XML PATH

尝试将其更改为

SET @CalledMLMs = (SELECT CalledMLM FROM @MLMTbl FRO XML PATH);