需要替代使用SQL Server 2000的交叉应用吗

需要替代使用SQL Server 2000的交叉应用吗,sql,sql-server,Sql,Sql Server,我编写了以下脚本,该脚本使用CROSS-APPLY参数在我的SQL Server 2008 developer数据库中运行良好,但对于拥有SQL Server 2000数据库且不希望更改SSMS中的兼容性设置的客户端,它将不起作用 有人能建议一种方法来转换我下面的脚本,以便不使用交叉应用参数吗?谢谢 DECLARE @Flag INT SET @Flag = 1 WHILE (@Flag < (SELECT TOP 1 (COUNT(CUSTOMERPN)) AS COUNTCUST FR

我编写了以下脚本,该脚本使用CROSS-APPLY参数在我的SQL Server 2008 developer数据库中运行良好,但对于拥有SQL Server 2000数据库且不希望更改SSMS中的兼容性设置的客户端,它将不起作用

有人能建议一种方法来转换我下面的脚本,以便不使用交叉应用参数吗?谢谢

DECLARE @Flag INT
SET @Flag = 1
WHILE (@Flag < (SELECT TOP 1 (COUNT(CUSTOMERPN)) AS COUNTCUST FROM FC_Nestle
GROUP BY CustomerPN
ORDER BY COUNTCUST DESC))
BEGIN
--UPDATE AFS_TOPRODUCE COUNTS
UPDATE FC_Nestle
SET AFS_ToProduce = CustReqQty - AFS_OH
--UPDATE SUBSEQUENT AFS_OH INVENTORY COUNTS
update FC_Nestle 
set AFS_OH = - fc2.AFS_ToProduce 
from FC_Nestle 
CROSS APPLY 
(   
    select fc2.AFS_ToProduce   
    from    
    (     
        select top 1         
            fc2.AFS_ToProduce       
        from FC_Nestle fc2      
        where fc2.ForecastID < FC_Nestle.ForecastID and fc2.CustomerPN = FC_Nestle.CustomerPN     
        order by fc2.ForecastID desc   
    ) fc2   
    where fc2.AFS_ToProduce < 0 
) fc2 
where FC_Nestle.AFS_ToProduce > 0 
SET @Flag = @Flag + 1
END

这将帮助您:

update fc_test
   set AFS_OH = - fc2.AFS_ToProduce
  from fc_test
 -- Self join to find previous row
 inner join fc_test fc2
 -- which has lower forecastid
    on fc2.ForecastID < fc_test.ForecastID
 where fc_test.AFS_ToProduce > 0
 -- and negative afs_toproduce
   and fc2.afs_toproduce < 0
 -- and is a row immediately before
 -- ie there is no other row closer to fc_test then current fc2
   and not exists (select null 
                     from fc_test fc3
                    where fc3.forecastid > fc2.forecastid
                      and fc3.ForecastID < fc_test.ForecastID)
我使用的表和列名与上次相同


Live test位于。

欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮{},以精确地格式化和语法突出显示它!哦,伙计,你真的不应该重复使用你给派生表的别名,我在同一个查询中计算了三个不同的fc2表,我记得你上次帮过我。我需要把它放在我的While循环中,还是像你在这里一样运行它?我在循环中运行了脚本,它没有修改任何记录。我看了代码,但没有看到任何明显的东西。再次感谢你,尼古拉@ToddS的想法是用这个更新替换原始更新,但是您应该用真实的表名替换表名,并添加CustomerPN过滤器。欢迎各位:-