sql - 交叉应用不适用于 SQL SERVER 2000?

标签 sql sql-server sql-server-2000

如何在 SQL Server 2000 中使用与 CROSS APPLY 等效的东西?

我有一个函数返回传递的 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 rctid=@RctId

  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 rctid=@PARENTID
   WHILE(@PARENTID IS NOT NULL)
   BEGIN
     SELECT @PARENTCODE=rctCode from RiskCategory WHERE rctid=@PARENTID
     IF @PARENTCODE='All'
      SET @PARENTCODE=''
     SELECT @CODE=@PARENTCODE +'.'+ @CODE 
     SELECT @PARENTID =rctParentID from Riskcategory where rctid= @PARENTID 
   END
    SELECT @CODE=Substring(@CODE+@DESC,2,len(@CODE+@DESC))
    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 中不起作用。我明天发布。请帮忙!!

我会很感激

谢谢

最佳答案

由于您使用的函数始终只返回一个结果,因此您不需要交叉应用。应该可以将表值函数更改为标量值函数。

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 rctid=@RctId
  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 rctid=@PARENTID
   WHILE(@PARENTID IS NOT NULL)
   BEGIN
     SELECT @PARENTCODE=rctCode from RiskCategory WHERE rctid=@PARENTID
     IF @PARENTCODE='All'
        SET @PARENTCODE=''
     SELECT @CODE=@PARENTCODE +'.'+ @CODE 
     SELECT @PARENTID = rctParentID from Riskcategory where rctid= @PARENTID 
   END
    SELECT @CODE=Substring(@CODE+@DESC,2,len(@CODE+@DESC))
    SELECT @topParentRiskCat = @CODE
  END

  RETURN @topParentRiskCat
END

关于sql - 交叉应用不适用于 SQL SERVER 2000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4644740/

相关文章:

php - 我可以从 MySQL 读取 SQL Server 中的表吗?

tsql - 为什么这个 SQL CAST 不起作用?

sql - 根据SQL语句的select子句中的列顺序进行优化

sql-server - 更改服务器核心数量后是否需要重新优化 View 和流程

sql - 使用查询 SQL Server 2005 选择 DATEADD 分钟

sql-server - SQL 服务器 : how to determine what will break when downgrading a database?

mysql - VARCHAR(3) 不支持获取默认值 N'no' NULL DEFAULT 'no'

java - 在 hibernate 中使用 EXISTS 仅返回一行以提高性能(不使用 setMaxResult)

sql - 使用 CTE 的奇怪结果

sql - 使用表列值之一创建额外的总和列