2011-01-10 22 views
3

SQL Server 2000でCROSS APPLYに相当するものを使用するにはどうすればよいですか?CROSS APPLYはSQL Server 2000で動作しませんか?

私は、渡されたIDのトップレベルの親を返す関数を持っています。

 INSERT INTO @TopRiskCat 
    SELECT R.rskid 
     ,a.topParentRiskCat AS TopLevelRiskCat 
    FROM RISKS R 
    INNER JOIN RiskAnalysis RA 
    ON R.rskId = RA.ranRiskId 
    INNER JOIN RiskCategory RC 
    ON RA.ranRiskAnalId = RC.rctId 
    CROSS APPLY fn_GetTopParentRiskCategory(RC.rctid) as a 

を次のようにクエリで使用

ALTER Function [dbo].[fn_GetTopParentRiskCategory] 
(
@RctId int 
) 
RETURNS @TEMP_TABLE TABLE 
(
rctId int, 
topParentRiskCat Varchar(100) 
) 
AS 
BEGIN 
    DECLARE @PARENTID INT 
    DECLARE @GRANDPARENTID INT 
    DECLARE @CODE VARCHAR(100) 
    DECLARE @DESC VARCHAR(100) 
    DECLARE @PARENTCODE VARCHAR(100) 


    SELECT @PARENTID= rctParentID from RiskCategory where [email protected] 

    SELECT @GRANDPARENTID= rctParentId from RiskCategory where rctid= @PARENTID 
    IF @GRANDPARENTID IS NULL 
    BEGIN 
    SELECT @CODE='ALL' 
    INSERT INTO @TEMP_TABLE SELECT @Rctid,@CODE 
    END 
    ELSE 
    BEGIN 
    SELECT @CODE='' 
    SELECT @DESC=rctDescription from RiskCategory where [email protected] 
    WHILE(@PARENTID IS NOT NULL) 
    BEGIN 
    SELECT @PARENTCODE=rctCode from RiskCategory WHERE [email protected] 
    IF @PARENTCODE='All' 
     SET @PARENTCODE='' 
    SELECT @[email protected] +'.'+ @CODE 
    SELECT @PARENTID =rctParentID from Riskcategory where rctid= @PARENTID 
    END 
    SELECT @CODE=Substring(@[email protected],2,len(@[email protected])) 
    INSERT INTO @TEMP_TABLE SELECT @RctID,@CODE 
    END 

RETURN 
END 

それは私が明日リリース持っている2000年では動作しません。助けてください !!

使用する機能は、常に1つの結果だけを返すと私は

おかげ

+0

DDL)、我々は別の解決策を提案することができます。 –

+0

お返事ありがとうございました。私は上記の関数で以下のクエリに参加する必要があるクエリを持っています。この関数は、動的ツリーに対して実際に解析し、最上位の親カテゴリを取得します。 –

+0

それは価値があるので、あなたの関数は与えられたrctidの親ツリーを計算しているようです。常に1つのレコードしか返しません。 1つのVARCHARを返すように関数を変更し、CROSS APPLYではなくselectで呼び出します。 –

答えて

0

感謝するよ、あなたはクロスを適用する必要はありません。テーブル値関数をスカラー値関数に変更することは可能です。

SQLステートメント

INSERT INTO @TopRiskCat 
SELECT R.rskid 
     , a.topParentRiskCat AS TopLevelRiskCat 
     , fn_GetTopParentRiskCategory(RC.rctID) 
FROM RISKS R 
     INNER JOIN RiskAnalysis RA ON R.rskId = RA.ranRiskId 
     INNER JOIN RiskCategory RC ON RA.ranRiskAnalId = RC.rctId 

スカラー値関数、あなたが(関連など、必要なものを説明し、おそらく場合はSQL Server 2000のCROSS APPLY` `には等価ではありません

ALTER Function [dbo].[fn_GetTopParentRiskCategory] (@RctId int) 
RETURNS Varchar(100) AS 
BEGIN 

    DECLARE @topParentRiskCat Varchar(100) 
    DECLARE @PARENTID INT 
    DECLARE @GRANDPARENTID INT 
    DECLARE @CODE VARCHAR(100) 
    DECLARE @DESC VARCHAR(100) 
    DECLARE @PARENTCODE VARCHAR(100) 


    SELECT @PARENTID= rctParentID from RiskCategory where [email protected] 
    SELECT @GRANDPARENTID= rctParentId from RiskCategory where rctid= @PARENTID 

    IF @GRANDPARENTID IS NULL 
    BEGIN 
    SELECT @topParentRiskCat = 'ALL' 
    END 
    ELSE 
    BEGIN 
    SELECT @CODE='' 
    SELECT @DESC=rctDescription from RiskCategory where [email protected] 
    WHILE(@PARENTID IS NOT NULL) 
    BEGIN 
    SELECT @PARENTCODE=rctCode from RiskCategory WHERE [email protected] 
    IF @PARENTCODE='All' 
     SET @PARENTCODE='' 
    SELECT @[email protected]CODE +'.'+ @CODE 
    SELECT @PARENTID = rctParentID from Riskcategory where rctid= @PARENTID 
    END 
    SELECT @CODE=Substring(@[email protected],2,len(@[email protected])) 
    SELECT @topParentRiskCat = @CODE 
    END 

    RETURN @topParentRiskCat 
END 
+0

恐ろしい..ありがとうLieven ..それは働く.. –

+0

締め切りの締め切りはストレスが多いかもしれません。うれしいことはあなたのために働いた。 –

+0

非常に真実:)私はクエリがあるhttp://stackoverflow.com/questions/4645210/sql-server-non-clustered-index-on-table-varaible ..あなたが答えることができればそれは素晴らしいだろう。ありがとう –

関連する問題