2011-01-10 85 views
3

如何在SQL Server 2000中使用相當於CROSS APPLY的東西?CROSS APPLY不適用於SQL SERVER 2000?

我有一個函數返回傳遞的id的頂級父。

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 

用於查詢,如下所示

 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 

它不會在2000年工作,我有明天發佈。請幫忙 !!

我會感激

感謝

+0

有沒有類似`CROSS APPLY`在SQL Server 2000中或許,如果你解釋你需要什麼(包括相關DDL),我們可以提出另一種解決方案。 – 2011-01-10 08:09:01

+0

謝謝Lieven的回覆。我在上面的函數中有一個查詢,我必須加入下面的查詢。這個函數實際解析動態樹來獲取頂級父類別。 – 2011-01-10 08:17:22

回答

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 

標量值的功能

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