1

私は SQL Server 2000 を使用していますが、これを行う方法に行き詰まりを感じています。

.Net Web アプリのグリッドビューにバインドされた単一の結果セットを返すストアド プロシージャがあります。

次のように既存の 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 行後です。

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 に答える