2009-12-11 1 views
5

リンクサーバーを使用して他のデータベースからデータをプルする複雑なストアドプロシージャがあります。このデータは、出力用の選択クエリで結合された一時テーブルに格納されます。プロシージャは正常に動作しますが、ビジュアルスタジオでは、デザイナを使用してストアドプロシージャをデータセットに追加しようとすると、オブジェクト名#tmpまたは最初のtempテーブルが呼び出されたときにエラーが発生します。データベーススキーマを取得できません。これは、ASP.NETでsqldatasourceを使用する場合と同じです。Visual Studioのテンポラリテーブルを使用するストアドプロシージャのフィールドスキーマを取得する

この手順はまだ使用できますが、出力するすべての列を手動でデータテーブルに追加する必要があります。これは手作業で行う苦痛であり、Visual Studioがストアドプロシージャからの出力フィールドを収集する方法と関係があると仮定しますが、通常の方法で実行するようには見えません。私はこれを行うにはかなりの時間がかかるので、これを修正する方法があります。手動ですべての列を追加する必要はありません。時間がかかり、エラーが発生しやすくなります。

+0

ストアドプロシージャの代わりにテーブル値関数を使用できない理由はありますか? – Wilhelm

+0

私は知っている限り、関数内で動的SQLまたはオープンクエリを使用することはできません。私が間違っているなら、私を訂正してください。 – PeteT

+0

はるかに多くの研究の後、私自身の質問に答えました。奇妙な解決策があります。 – PeteT

答えて

12

:あなたのストアドプロシージャの開始時に

IF 1=0 BEGIN 
SET FMTONLY OFF 
END 

は、設計者が正しくスキーマ情報を取得することができます。このコードは明らかに実行されませんが、問題を解決します。 FMTONLYは、ストアドプロシージャに関するメタデータを返すだけです。 FMTONLY OFF

私は次の場合、誰かが他のポストに1 = 0を入れる理由を知らない

SETを:私は、SQL Server 2005の

+1

警告!これを行うと、Visual Studioデザイナがチェックするたびにストアドプロシージャが実際に完全に実行され、コミットされることに注意してください。あなたのprocで更新/削除/挿入文があれば、それらは実行されます。データのみを返すプロシージャでのみ、これを使用してください。そうでなければ、これは素晴らしい発見です! –

0

メタデータを読み取ることができない理由は、#Tempテーブルがあり、一時テーブルが見つからないためです。あなたはそれがデータに依存する可能性があるため、あなたがここにメタデータを取得することができない理由がある

SELECT TOP 0 
    CONVERT (NULL, VarChar (30)) AS Column1, 
    CONVERT (NULL, INTEGER) AS Column2, 
    CONVERT (NULL, DECIMAL (9, 2)) AS Column3, 
    CONVERT (NULL, VarChar (55)) AS Column4 

UNION 

SELECT * 
FROM #MyTempTable 
+0

Semesのようなものは、かなり長い時間がかかります。なぜなら、クリスタルレポートは面倒なくこれを行うことができるので、Visual Studioがメタデータを通常どおりに取得することができない理由はわかりません。 – PeteT

0

TOP 0クエリを使用してメタデータを定義することによって、それを回避しようとすることができます。例えば。

If Exists(Select 1 From Table Where Column1 = 7) 
    Select Col1, Col2 From Table2 
Else 
    Select Col3, Col4, Col5 From Table2 

データに応じて異なる数の列を持つストアドプロシージャは書きませんが、実行することは可能です。ちょっとだけ、このようなストアドプロシージャがあるとします。どの列リストを返す必要がありますか?私は奇妙なソリューションが入れたしばらくの間、グーグル後

+0

ええ、私はそれを理解していて、潜在的に異なる数の列を返す場所を書くことも決してしません。しかし、なぜ私が指定した変数の列を取得するだけではありません。 – PeteT

+0

まだ決定的ではない可能性があるためです。また、ストアドプロシージャがレコードセット、レコードセット、または複数のレコードセットを返すことができないことも考慮してください。 乱数関数を使用して、各呼び出しが異なる列を返すようにすることもできます。 –

+0

ええ、それはデザイナーのためだけに使用されています。開発者は、最終的にどの列が存在する必要があるかを知っていますので、ストアドプロシージャに与えた値に基づいて配置するほうが簡単です。一例は、それが与える値をとり、ストアドプロシージャが与える最後のデータテーブルを引き出すクリスタルレポートです。実行時に存在しないかもしれないという事実は重要ではありません。これは、SQLクエリを簡単に変更することができるため、常にそうであるためです。 – PeteT

2

これは私の作品を使用していますか? FMTONLYがONになっていると、IF/ELSE文のすべての条件が実行されることを証明することだけだったと思います!

通常、FMTONLYは、SSPやVisual Studioなどのアプリケーションでは、stpのスキーマ情報を更新するときにオンになります。 FMTONLYを指定せずに文を実行すると、列名のみが返されます。問題は、文が実行されないために一時表が作成されないため、一時表のselect文によって戻される列が不明であることです。

FMTONLYをONに設定すると、stpが完全に実行されます。 stpに挿入/更新/削除ステートメントがある場合、それらは実行されるので、OFFにする前にFMTONLYの状態を取得し、更新を防ぐための適切な対策を講じてください。

FMTONLYがオンかどうかは、1 = 0であるかどうかを調べることで判断できます。FMTONLYがオンの場合、stpが正常に返す列を単純に選択できます。