Возврат набора результатов из хранимой процедуры с функцией табличного значения или представлением

Я использую SQL Server 2000 и чувствую себя застрявшим о том, как это сделать:

У меня есть хранимая процедура, которая возвращает один набор результатов, который привязан к сетке в веб-приложении.Net.

Теперь я хотел бы иметь "таблицу", чтобы я мог использовать ее в существующем приложении VB6, например:

SELECT * FROM myTable 

... где схема myTable отражает столбцы в результирующем наборе, возвращенном из этого sproc.

Вот скрипт, который работает:

CREATE TABLE #ResultSet (
    StateFIPS           CHAR(2)
    ,CountyFIPS         CHAR(3)
,StateName          VARCHAR(30)
,CountyName         VARCHAR(40)
,MostRecentData_P       VARCHAR(20)
,PData              VARCHAR(3)
,AvgNbrMtgPerMonthInLastYear_P  INT
,MostRecentData_R       VARCHAR(20)
,RData              VARCHAR(3)
,AvgNbrMtgPerMonthInLastYear_R  INT
,MostRecentData_FHA     VARCHAR(20)
,MostRecentData_VA      VARCHAR(20)
)
INSERT INTO #ResultSet
EXECUTE dbo.FetchCoverageByState_V2 
SELECT * FROM #ResultSet

Я попытался показать это, но меня ударили по ошибке:

"Views or functions are not allowed on temporary tables"

Я также попробовал такую ​​функцию:

create function dbo.udfCoverages() 

returns @ResultSet table (
    StateFIPS   CHAR(2)
    ,CountyFIPS CHAR(3)
,StateName  VARCHAR(30)
,CountyName VARCHAR(40)
,PData      VARCHAR(3)
,RData      VARCHAR(3)  
) as
INSERT @ResultSet (
    StateFIPS           CHAR(2)
    ,CountyFIPS         CHAR(3)
,StateName          VARCHAR(30)
,CountyName         VARCHAR(40)
,MostRecentData_P       VARCHAR(20)
,PData              VARCHAR(3)
,AvgNbrMtgPerMonthInLastYear_P  INT
,MostRecentData_R       VARCHAR(20)
,RData              VARCHAR(3)
,AvgNbrMtgPerMonthInLastYear_R  INT
,MostRecentData_FHA     VARCHAR(20)
,MostRecentData_VA      VARCHAR(20)
)
EXECUTE dbo.FetchCoverageByState_V2  
return

При попытке UDF я получаю синтаксические ошибки возле INSERT, и мне интересно, поддерживает ли SQL Server 2000 это.

Чтобы вы посоветовали?

РЕДАКТИРОВАНИЕ-ОБНОВЛЕНИЕ (за первое предложение от Рэя ниже):

create function dbo.udfCoverages() 
returns @ResultSet table (
    StateFIPS   CHAR(2)
    ,CountyFIPS CHAR(3)
,StateName  VARCHAR(30)
,CountyName VARCHAR(40)
,PData      VARCHAR(3)
,RData      VARCHAR(3)  
) as
BEGIN   
INSERT @ResultSet 
(
         StateFIPS          CHAR(2)
        ,CountyFIPS         CHAR(3)
    ,StateName          VARCHAR(30)
    ,CountyName         VARCHAR(40)
    ,MostRecentData_P       VARCHAR(20)
    ,PData              VARCHAR(3)
    ,AvgNbrMtgPerMonthInLastYear_P  INT
    ,MostRecentData_R       VARCHAR(20)
    ,RData              VARCHAR(3)
    ,AvgNbrMtgPerMonthInLastYear_R  INT
    ,MostRecentData_FHA     VARCHAR(20)
    ,MostRecentData_VA      VARCHAR(20)
)
    EXECUTE dbo.FetchCoverageByState_V2 
    return
END

Здесь я получаю: Строка 19: Неверный синтаксис рядом с 'CHAR'. ПРИМЕЧАНИЕ. Строка 19 - это две строки после вставки выше.

3 ответа

Решение

Попробуйте использовать OPENROWSET, как в этом вопросе. Я думал, что написал об этом некоторое время, но, возможно, нет.

Вставьте результаты хранимой процедуры во временную таблицу

Не забудьте поднять голос Аарона.

Независимо от того, что вы делаете, вы не сможете преобразовать процедуру в табличную функцию или в представление. Существуют серьезные ограничения в отношении того, что функция может делать, а что нет. Поскольку TVF или представление можно комбинировать с любым другим оператором, например, отображаться в SELECT как подзапрос или быть частью UPDATE/INSERT/DELETE и т. Д. И т. Д., Существуют определенные ограничения поведения, налагаемые на функции, особенно когда дело доходит до исполнения побочных эффектов. Процедура сына с другой стороны свободна как птица.

Единственное, что вы можете сделать, это записать выходные данные процедуры в таблицу, используя INSERT ... EXEC... и все, с дополнительными дополнительными ограничениями, которые не могут быть другими INSERT ... EXEC... вложенными,

Все, что вы опубликовали, указывает, что fetchCcoverageByState_V2 должна быть табличной функцией, и это единственный путь, который вы должны использовать.

Тебе нужно begin а также end обернутый вокруг тела функции (после as)

Другие вопросы по тегам