[ASP.NET]データセットで一時テーブルのストアドを強引に使う

みんな大好きな型付きデータセット。

レガシーな環境では、避けて通れないデータセット。

さて、そのデータセットに、頑張って作ったストアドプロシージャをテーブルアダプター経由で登録しようとすると、エラーになった。

原因は、一時テーブルを使ったストアドプロシージャからはデータ列を解析できないからみたい。
一時テーブルを使わないストアドって・・・・思ってたら、データセットをだます方法で強引に使えるみたい。

まず、こういうストアドプロシージャがあったとする。

ALTER Procedure [dbo].[DummyUseTemp] 
AS

SELECT 1 AS A, 2 AS B, 3 AS C, 4 AS D, 5 AS E ,'dummy' AS Comment INTO #list;
SELECT * FROM #list;

GO

このままだと#listという一時テーブルがあるので使えない。

これを、とりあえず、一時テーブル使わない形で最終結果に合わせてダミー出力するように書き直す。

ALTER Procedure [dbo].[DummyUseTemp] 
AS

SELECT 1 AS A, 2 AS B, 3 AS C, 4 AS D, 5 AS E ,'dummy' AS Comment;

--SELECT 1 AS A, 2 AS B, 3 AS C, 4 AS D, 5 AS E ,'dummy' AS Comment INTO #list;
--SELECT * FROM #list;

GO

これで、もう一度テーブルアダプターから登録させると、一時テーブル使ってないので自動でデータ列が作成されます。
ds4

このまま作っちゃった後に、ストアドプロシージャだけコメントを外して、元に戻します。

これで動きます。

ただ、普通に’dummy’とか入れると、MaxLengthプロパティがdummyの5文字になってたりするので、変更するたびに、プロパティを毎回変えなきゃならんので、SELECTする際にCASTとか駆使するとよいかも。

SELECT 0 AS A, 0 AS B, 0 AS C, 0 AS D, 0 AS E, CAST('dummy' AS varchar(10)) AS Comment;

しかし、VS2008で起きた問題だから、VS2013でよきに計らってくれてるかもと思って、VS2013で試してみたけど変わってなかった・・。

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>