使用表值函数或视图从存储过程返回结果集
我正在使用 SQL Server 2000,并且对如何执行此操作感到困惑:
我有一个存储过程,它返回绑定到 .Net Web 应用程序中的 gridview 的单个结果集。
现在我想要一个“表”,这样我就可以在现有的 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年支持这一点。
你会推荐什么?
编辑更新(根据下面 Ray 的第一个建议):
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 行是上面 INSERT 之后的 2 行。
I am using SQL Server 2000 and feeling stuck about how to do this:
I have a stored procedure that returns a single resultset which is bound to a gridview in a .Net web app.
Now I'd like to have a "table" so I can use it in an existing VB6 application like this:
SELECT * FROM myTable
...where the schema of "myTable" is reflects the columns in the result set returned from this sproc.
Here is a script that works:
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
I tried to put this into a view but I get slapped with errors:
"Views or functions are not allowed on temporary tables"
I also tried a function like this:
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
In the UDF attempt, I am getting syntax errors near the INSERT and I am wondering if SQL Server 2000 supports this.
What would you recommend?
EDIT-UPDATE (per first suggestion from Ray below):
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
Here I get: Line 19: Incorrect syntax near 'CHAR'. NOTE: Line 19 is 2 lines after the INSERT above.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
尝试使用 OPENROWSET,如本问题所示。我以为我曾经在博客上谈论过它,但也许没有。
将存储过程的结果插入临时表
记得给亚伦的回答点赞。
Try using OPENROWSET, as in this question. I thought I had blogged about it some time, but perhaps not.
Insert results of a stored procedure into a temporary table
Remember to upvote Aaron's answer.
无论您做什么,都无法将过程转换为表值函数或视图。对于函数允许做什么和不允许做什么有严格的限制。由于 TVF 或视图可以与任何其他语句组合,例如作为子查询出现在 SELECT 中,或者作为 UPDATE/INSERT/DELETE 的一部分等等,因此对函数施加了某些行为限制,特别是当涉及到执行副作用时。另一方面,程序子却像小鸟一样自由。
您唯一能做的就是使用 INSERT ... EXEC ... 将过程的输出捕获到表中,仅此而已,还有额外的限制,即不能有另一个 INSERT ... EXEC ... 嵌套。
您发布的所有内容都表明 fetchCcoverageByState_V2 必须是表值函数,这是您应该追求的唯一途径。
No matter what you do, you will not be able to transform a procedure into a table valued function nor into a view. There are severe restriction around what a function is allowed to do and what not. Because a TVF or a view can be combined with any other statement, like appear in a SELECT as a subquery, or be part of an UPDATE/INSERT/DELETE and so on and so forth, there are certain behavior restrictions imposed on functions, specially when in comes to execution side effects. Procedure son the other hand are free as a bird.
The only thing you can do is to capture the output of a procedure into a table, using INSERT ... EXEC... and that's it, with the extra added restrictions that there cannot be another INSERT ... EXEC ... nested.
Eeverything you posted points that fetchCcoverageByState_V2 must be a table valued function, and that is the only avenue you should pursue.
您需要将
begin
和end
包裹在函数体中(在as
之后)you need
begin
andend
wrapped around the function body (after theas
)