2011-01-10 60 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