1

我正在使用 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 是否支持这一点。

你会推荐什么?

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 行。

4

3 回答 3

1

无论您做什么,您都无法将过程转换为表值函数或视图。一个函数可以做什么和不可以做什么有严格的限制。因为 TVF 或视图可以与任何其他语句组合,例如作为子查询出现在 SELECT 中,或者是 UPDATE/INSERT/DELETE 的一部分等等等等,所以对函数有一定的行为限制,特别是当涉及到执行副作用时。程子反倒像鸟儿一样自由。

您唯一能做的就是使用 INSERT ... EXEC ... 将过程的输出捕获到表中,仅此而已,还有额外的限制,即不能有另一个 INSERT ... EXEC ... 嵌套.

您发布的所有内容都指出 fetchCcoverageByState_V2 必须是表值函数,这是您应该追求的唯一途径。

于 2010-01-11T21:07:47.417 回答
1

尝试使用 OPENROWSET,就像在这个问题中一样。我以为我已经在博客上写过一段时间了,但也许不是。

将存储过程的结果插入临时表

记得支持亚伦的回答。

于 2010-01-11T21:22:41.490 回答
0

您需要beginend包裹在函数体周围(在 之后as

于 2010-01-11T21:06:48.670 回答