2012-01-19 16 views
2

この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 

答えて

2

もう一つの可能​​な回避策:あなたは再びWHERE句の計算値を入れることができます。

SELECT PostID, Title, dbo.fn_Root(PostID) AS Expr1 
FROM Post 
WHERE dbo.fn_Root(PostID) = 5 
+0

ありがとうございました。 – ONYX

+0

これは機能を2回評価しますか?関数がSQLで決定的にフラグが立てられているか、何らかの形で出力の各行にキャッシュされているかどうかによって異なりますか? – jklemmack

3

あなたは、SQL ServerのWHERE句で直接計算/計算列のエイリアスを参照することはできません。しかし、1つの些細な問題を回避するには、計算列を参照して、文をラップし、外であなたのWHERE句を配置することです:

SELECT * FROM (
    SELECT PostID, Title, dbo.fn_Root(PostID) AS Expr1 
    FROM Post) 
WHERE Expr1 = 5 
+0

"SQL ServerのWHERE句で計算/計算カラムを直接参照することはできません"。そのステートメントは間違っています(@ChristianSpechtの回答を参照)。できないことは、WHERE句の列エイリアスを参照することです。 –

+0

今日は何かを学んだことをありがとう。 – ONYX

関連する問題