我有一个包含3个字段的表:
idArticle (int)
idParent (int)
idAlias (nvarchar[255])
我想在该表中添加一个计算列,
这会将Path
返回给文章。
也就是说,假设我们有两行:
1,0,"First"
2,1,"Second"
如果我们在第二行运行该函数,
我想在这种情况下Path
返回First/Second
根据我的阅读,我需要创建一个Scalar Function
作为计算字段,
用idArticle
喂它。
我的SQL技能非常局限于基本查询,我不知道如何处理这个问题。 有谁在那里救援?
答案 0 :(得分:2)
1)首先我创建一个递归内联TVF函数(不是标量函数 - 出于性能原因),以便获得某篇文章@idArticle
的路径:
CREATE FUNCTION dbo.GetArticlePath(@idArticle INT)
RETURNS TABLE
AS
RETURN
WITH CteRecursive
AS
(
SELECT cld.idArticle, cld.idParent, CONVERT(NVARCHAR(MAX), cld.idAlias) AS ArticlePath
FROM dbo.Article cld
WHERE cld.idArticle = @idArticle
UNION ALL
SELECT prt.idArticle, prt.idParent, prt.idAlias + N'\' + CONVERT(NVARCHAR(MAX), cld.ArticlePath) AS ArticlePath
FROM dbo.Article prt INNER JOIN CteRecursive cld ON cld.idParent = prt.idArticle
)
SELECT *
FROM CteRecursive rec
WHERE rec.idParent = 0;
GO
2)样本用法:
SELECT *
FROM dbo.GetArticlePath(2) f
/*
idArticle idParent ArticlePath
----------- ----------- ------------
1 0 First\Second
*/
3)因此我会使用UPDATE
语句来使用此函数:
UPDATE a
SET ArticlePath = p.ArticlePath
FROM dbo.Article a
OUTER APPLY dbo.GetArticlePath(a.idArticle) p
WHERE a.idArticle = 2;
SELECT *
FROM dbo.Article;
/*
idArticle idParent idAlias articlePath
----------- ----------- -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 0 First NULL
2 1 Second First\Second
*/