2009-07-09 61 views
0

我試圖修改SQL 2000中現有的SPROC。最初的SPROC使用FuncView作爲遊標的一部分。新的報告不需要遊標,但我不確定如何在遊標語句之外執行FuncView。下面的第一個例子是原始代碼的遊標部分。第二個是我的修改....以及由此產生的錯誤消息。請幫忙...在存儲過程中執行FuncView

DECLARE @FuncView_PlantConditionAssessmentMetrics VARCHAR(8000) 
DECLARE FuncView_PlantConditionAssessmentMetricsCursor CURSOR FOR 
    Select 
     'UPDATE #rsTemp 
      SET TotalComponentsOnTask = rsMetric.TotalComponentsOnTask, 
      TotalComponentsAssessedMeasured = rsMetric.TotalComponentsAssessedMeasured, 
      TotalComponentsNotMeasured = rsMetric.TotalComponentsNotMeasured, 
      TotalComponentsAssessedNotMeasured = rsMetric.TotalComponentsAssessedNotMeasured, 
      OverdueElevatedItems = rsMetric.OverdueElevatedItems, 
      OverdueAdvisoryItems = rsMetric.OverdueAdvisoryItems 
     FROM ['+DBCatalog+'].[dbo].FuncView_PlantConditionAssessmentMetrics ('''+CONVERT(varchar(50), @StartDate, 100)+''','''+ CONVERT(varchar(50), @EndDate, 100)+''') rsMetric 
     WHERE DBCatalog = '''+DBCatalog+'''' 
    FROM [HostedTangoSettingsSQL].[dbo].[DatabaseTable] 
    WHERE CustomerID = @CustomerID 
     AND 
     HostedDBTypeID IN (SELECT HostedDBTypeID FROM [HostedTangoSettingsSQL].[dbo].defs_HostedDBTypes 
       WHERE IsActiveDatabase = 1 AND HostedDBTypeID <> 3) 


OPEN FuncView_PlantConditionAssessmentMetricsCursor 
FETCH NEXT FROM FuncView_PlantConditionAssessmentMetricsCursor INTO @FuncView_PlantConditionAssessmentMetrics 
WHILE (@@fetch_status <> -1) 
    BEGIN 
     EXEC(@FuncView_PlantConditionAssessmentMetrics) 
     FETCH NEXT FROM FuncView_PlantConditionAssessmentMetricsCursor INTO @FuncView_PlantConditionAssessmentMetrics 
    END 
CLOSE FuncView_PlantConditionAssessmentMetricsCursor 
DEALLOCATE FuncView_PlantConditionAssessmentMetricsCursor 



DECLARE @FuncView_PlantConditionAssessmentMetrics VARCHAR(8000) 

SELECT FuncView_PlantConditionAssessmentMetrics = @FuncView_PlantConditionAssessmentMetrics 
    'UPDATE #rsTemp 
     SET TotalComponentsOnTask = rsMetric.TotalComponentsOnTask, 
      TotalComponentsAssessedMeasured = rsMetric.TotalComponentsAssessedMeasured, 
      TotalComponentsNotMeasured = rsMetric.TotalComponentsNotMeasured, 
      TotalComponentsAssessedNotMeasured = rsMetric.TotalComponentsAssessedNotMeasured, 
      OverdueElevatedItems = rsMetric.OverdueElevatedItems, 
      OverdueAdvisoryItems = rsMetric.OverdueAdvisoryItems 
     FROM ['[email protected]+'].[dbo].FuncView_PlantConditionAssessmentMetrics ('''+CONVERT(varchar(50), @StartDate, 100)+''','''+ CONVERT(varchar(50), @EndDate, 100)+''') rsMetric 
     WHERE DBCatalog = '''[email protected]+'''' 


Server: Msg 170, Level 15, State 1, Procedure UDR_PlantConditionAssessmentMetrics, Line 54 
Line 54: Incorrect syntax near 'UPDATE #rsTemp 
     SET TotalComponentsOnTask = rsMetric.TotalComponentsOnTask, 
      TotalComponentsAssessedMeasured = rsMetric.To'. 
+0

什麼是「FuncView」?在SQL Server中沒有這樣的術語。 – RBarryYoung 2009-07-13 19:36:11

回答

0

WOW,cursors AND dynamic SQL;你會接觸到各種各樣的壞習慣,難道你不是:)這是學習一些東西的好方法,但是當涉及到維護時它很糟糕。

看起來需要進行調整正是如此代碼:

SELECT @FuncView_PlantConditionAssessmentMetrics = 
    'UPDATE #rsTemp 
     SET TotalComponentsOnTask = rsMetric.TotalComponentsOnTask, 
       TotalComponentsAssessedMeasured = rsMetric.TotalComponentsAssessedMeasured, 
       TotalComponentsNotMeasured = rsMetric.TotalComponentsNotMeasured, 
       TotalComponentsAssessedNotMeasured = rsMetric.TotalComponentsAssessedNotMeasured, 
       OverdueElevatedItems = rsMetric.OverdueElevatedItems, 
       OverdueAdvisoryItems = rsMetric.OverdueAdvisoryItems 
     FROM [' 
     + @CustomerDesc + '].[dbo].FuncView_PlantConditionAssessmentMetrics (''' + CONVERT(VARCHAR(50), @StartDate, 100) + ''',''' 
     + CONVERT(VARCHAR(50), @EndDate, 100) + ''') rsMetric  WHERE DBCatalog = ''' + @CustomerDesc + '''' 

爲了使其與前面的代碼是一致的。