Возврат набора результатов из хранимой процедуры с функцией табличного значения или представлением
Я использую 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
)