在返回 xml 数据的 select 语句中调用用户定义函数
Calling User-Defined Function in select statement returning xml data
我在 SQL Server 2012 中创建了一个用户定义函数 returns XML。我想在 SELECT 语句中调用该函数。这可能吗?
当我尝试这样做时,出现错误:
The FOR XML clause is not allowed in a ASSIGNMENT statement.
我希望 SELECT 语句 return 一组这些命名方法,这些命名方法在其逻辑中具有其他命名方法的依赖性。
在主 CTE 中,我获得了具有依赖性的最新版本的方法。 UDF 通过每个方法的逻辑和 returns 在其中调用的任何方法。所以,我想在依赖方法名的SELECT语句和returnXML中调用UDF
函数有效,returns 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 语句中 return 是 XML 数据类型的函数吗?
我通过将函数更改为 return a table 而不是 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
然后我在select
中调用了'from'子句中的函数
;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
如果要将变量设置为一个值,则必须使用 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);
我在 SQL Server 2012 中创建了一个用户定义函数 returns XML。我想在 SELECT 语句中调用该函数。这可能吗? 当我尝试这样做时,出现错误:
The FOR XML clause is not allowed in a ASSIGNMENT statement.
我希望 SELECT 语句 return 一组这些命名方法,这些命名方法在其逻辑中具有其他命名方法的依赖性。 在主 CTE 中,我获得了具有依赖性的最新版本的方法。 UDF 通过每个方法的逻辑和 returns 在其中调用的任何方法。所以,我想在依赖方法名的SELECT语句和returnXML中调用UDF
函数有效,returns 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 语句中 return 是 XML 数据类型的函数吗?
我通过将函数更改为 return a table 而不是 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
然后我在select
中调用了'from'子句中的函数;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
如果要将变量设置为一个值,则必须使用 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);