2012-05-07 37 views
1

我編寫了以下腳本,該腳本在使用CROSS APPLY參數的SQL Server 2008開發人員數據庫中正常工作,但它不適用於擁有SQL Server 2000數據庫的客戶端不想更改SSMS中的兼容性設置。需要替代使用SQL Server 2000使用交叉應用

有人可以建議一種方法來轉換我的腳本,以便不使用CROSS APPLY參數嗎?謝謝!

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

歡迎使用StackOverflow:如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)格式和語法突出顯示它! –

+3

哦,你真的不應該重用你給派生表的別名,我在同一個查詢中計數了三個不同的'fc2'表 – Lamak

回答

2

這應該幫助你:

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) 

我使用的是相同的表和列名作爲最後一次。

現場測試是在Sql Fiddle

+0

是的,我記得你上次幫助過我。我是否需要將它放在我的While循環中,或者只是像在這裏一樣運行它? –

+0

我在循環中運行腳本,並沒有修改任何記錄。我查看了代碼,但我沒有看到任何明顯的東西。再次感謝尼古拉! –

+0

@ToddS這個想法是用這個替換原來的更新,但你應該用真正的替換表名並添加CustomerPN過濾器。歡迎您:-) –