Я создал пользовательскую функцию в SQL Server 2012, которая возвращает XML. Я хотел бы вызвать функцию в операторе SELECT. Это возможно? Когда я пытаюсь это сделать, я получаю сообщение об ошибке:
Предложение FOR XML не допускается в операторе ASSIGNMENT.
Я хочу, чтобы оператор SELECT возвращал набор этих именованных методов, которые в своей логике зависят от других именованных методов. В основном CTE я получаю последние версии методов, у которых есть зависимости. UDF проходит через логику каждого метода и возвращает все методы, вызываемые в нем. Итак, я хочу вызвать UDF в операторе SELECT и вернуть 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
Это CTE, который вызывает UDF.
;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 ответа
Если вы хотите присвоить переменной значение, вы должны использовать 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);
Я решил проблему, изменив функцию, чтобы она возвращала таблицу, а не 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
Затем я вызвал функцию в предложении from в select
;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
Похожие вопросы
Новые вопросы
sql-server
Microsoft SQL Server — это система управления реляционными базами данных (RDBMS). Используйте этот тег для всех выпусков Microsoft SQL Server, включая Compact, Express, Azure, Fast-track, APS (ранее PDW) и Azure SQL DW. Не используйте этот тег для других типов СУБД (MySQL, PostgreSQL, Oracle и т. д.). Не используйте этот тег для вопросов по программному обеспечению и разработке мобильных устройств, если только он не связан напрямую с базой данных.