Выполнение FuncView в хранимой процедуре - PullRequest
0 голосов
/ 09 июля 2009

Я пытаюсь изменить существующий SPROC в SQL 2000. Оригинальный SPROC использовал 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 ['+@CustomerDesc+'].[dbo].FuncView_PlantConditionAssessmentMetrics ('''+CONVERT(varchar(50), @StartDate, 100)+''','''+ CONVERT(varchar(50), @EndDate, 100)+''') rsMetric
        WHERE DBCatalog = '''+@CustomerDesc+''''


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'.

1 Ответ

0 голосов
/ 05 октября 2009

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

Чтобы привести его в соответствие с предыдущим кодом.

...