Возвращение набора результатов из хранимой процедуры с функцией табличного значения или представлением - PullRequest
1 голос
/ 11 января 2010

Я использую SQL Server 2000 и не могу понять, как это сделать:

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

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

SELECT * FROM myTable 

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

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

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 - это 2 строки после вставки выше.

Ответы [ 3 ]

1 голос
/ 12 января 2010

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

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

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

1 голос
/ 12 января 2010

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

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

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

0 голосов
/ 12 января 2010

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

...