このSQL関数がテーブルを反復処理し、が見つかりました。ParentID新しく作成された列ではwhere節を置いた場合を除いてコードが機能します。 where句を使用しないと、Expr1がツリーのルートとして生成されますが、これは条件を置くことができません。'Where'の式に無効な列名があります
誰かがこの問題を解決するのに役立つことができますか?
ALTER FUNCTION dbo.fn_Root
(
@PostID int
)
RETURNS int
AS
BEGIN
DECLARE @R int
SELECT @R = CASE WHEN ParentPostID = 0 THEN PostID
ELSE dbo.fn_Root(ParentPostID)
END
FROM Post
WHERE PostID = @PostID
RETURN @R
END
SELECT PostID, Title, dbo.fn_Root(PostID) AS Expr1
FROM Post WHERE Expr1 = 5
ありがとうございました。 – ONYX
これは機能を2回評価しますか?関数がSQLで決定的にフラグが立てられているか、何らかの形で出力の各行にキャッシュされているかどうかによって異なりますか? – jklemmack