いくつかの(レガシー)SQLコードをサポートする関数を作成しようとしています。関数はクエリの一部として使用されます。
SELECT
q.*,
fn_qncatxml(q.number, q.version) AS categories --XML aggregated category hierarchy
FROM
[dbo].[qn] q
残念ながら、SQL Serverには関数内のCTE式に関する既知の問題があるため、次のアプローチは機能しません(WITHソリューションの前のセミコロン)。残念ながら、このソリューションを次のようなスカラーを返す関数に適用する方法がわかりません。
CREATE FUNCTION [dbo].[fn_qncatxml](@qnnumber INT, @qnversion INT)
RETURNS XML
WITH RETURNS NULL ON NULL INPUT
BEGIN
RETURN
(
WITH [categories] AS
(
SELECT [qn].[number], [qn].[version], [cat].[catnumber], [qncat].[itemnumber], [cat].[parent], [cat].[description], 0 AS [distance]
FROM [qn]
LEFT JOIN [qncat] ON [qncat].[qnnumber] = [qn].[number] AND [qncat].[qnversion] = [qn].[version]
LEFT JOIN [cat] ON [cat].[catnumber] = [qncat].[catnumber] AND [cat].[status] = '1'
WHERE [qn].[number] = @qnnumber AND [qn].[version] = @qnversion
UNION ALL
SELECT [categories].[number], [categories].[version], [cat].[catnumber], [categories].[itemnumber], [cat].[parent], [cat].[description], [categories].[distance] + 1 AS [distance]
FROM [categories]
JOIN [cat] ON [cat].[catnumber] = [categories].[parent]
WHERE
[cat].[status] = '1'
)
SELECT DISTINCT * FROM [categories] FOR XML PATH('')
)
END
WITHとFORXMLPATH('')の間の部分を取り除き、いくつかの有効な引数を指定してこのブロックを実行すると、完全に機能します。
このCTE関数構文を私のシナリオで機能させる方法の手がかりはありますか?