2009-07-09 2 views
0

Я пытаюсь изменить существующий SPROC в SQL 2000. Исходный 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

+0

Я предполагаю, что это фактически табличная функция с нечетным именем – MartW

ответ

0

WOW, курсоры И динамический 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 + '''' 

Для того, чтобы привести его в соответствие с предыдущим кодом.

Смежные вопросы