我正在使用SQL Server 2000并且对如何执行此操作感到困惑:
我有一个存储过程,它返回一个结果集,该结果集绑定到.Net Web应用程序中的gridview。
现在我想要一个“表”,这样我就可以在现有的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是否支持这一点。
你会推荐什么?
EDIT-UPDATE(根据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行。
答案 0 :(得分:1)
无论您做什么,您都无法将过程转换为表值函数,也无法转换为视图。对于允许函数执行什么以及不执行什么操作存在严重限制。因为TVF或视图可以与任何其他语句组合,例如作为子查询出现在SELECT中,或者是UPDATE / INSERT / DELETE等等的一部分,因此对函数施加了某些行为限制,特别是什么时候来执行副作用。程序儿子另一方面像鸟一样自由。
你唯一能做的就是将一个过程的输出捕获到一个表中,使用INSERT ... EXEC ......就是这样,加上额外的限制,就是不能有另一个INSERT ... EXEC。 ..嵌套。
你发布的所有内容都指出fetchCcoverageByState_V2必须是一个表值函数,这是你应该追求的唯一途径。
答案 1 :(得分:1)
尝试使用OPENROWSET,就像这个问题一样。我以为我曾经写过一段时间的博客,但也许不是。
Insert results of a stored procedure into a temporary table
记得向Aaron的答案提出上诉。
答案 2 :(得分:0)
你需要begin
和end
缠绕在函数体上(as
之后)