Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
交叉应用不适用于SQL SERVER 2000?_Sql_Sql Server_Sql Server 2000 - Fatal编程技术网

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

交叉应用不适用于SQL SERVER 2000?,sql,sql-server,sql-server-2000,Sql,Sql Server,Sql Server 2000,如何在SQLServer2000中使用与交叉应用等效的东西 我有一个函数,返回传递的id的顶级父级。 ALTER Function [dbo].[fn_GetTopParentRiskCategory] ( @RctId int ) RETURNS @TEMP_TABLE TABLE ( rctId int, topParentRiskCat Varchar(100) ) AS BEGIN DECLARE @PARENTID INT DECLARE @GRANDPARENTID

如何在SQLServer2000中使用与交叉应用等效的东西

我有一个函数,返回传递的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 Server 2000中,交叉应用的
没有等效项。也许如果你解释一下你需要什么(包括相关的DDL),我们可以建议另一种解决方案。谢谢Lieven的回复。我在函数中有一个查询,我必须在上面加入下面的查询。此函数实际上解析到动态树以获取顶级父类别。它总是只返回一条记录。您应该能够更改函数以返回单个VARCHAR,并在select中调用它,而不是执行交叉应用。请您用一个小示例解释上述语句,好吗?非常正确:)我有一个查询。。如果你能回答,那就太好了。谢谢没有什么我可以添加到已经提供的答案。没关系,我已经在某种程度上优化了查询,没有索引。