9

クエリを実行してから、SQL Server 管理スタジオや sqlcmd などを使用して、受信した各列のデータ型とサイズを単純に表示する方法はありますか。

サーバーとクライアントの間でデータの送信が行われるには、この情報が存在する必要があるようです。表示していただけると大変助かります。

ちょっとした背景: 私が質問する理由は、50 行から 5000 行以上のコードを含む無数のレガシー ストアド プロシージャとやり取りする必要があるからです。一時テーブルに出入りする不可解な論理フロー、他のプロシージャ、文字列連結された eval ステートメントなどを試す必要はありません。私は実装についての知識を維持したくありません。単に、それらが機能するときに何を期待するかです。残念ながら、ロジック フローに従うことが、たとえば、管理スタジオ スタジオや .net のネイティブ型からデータ文字列表現の実際の型を推測しようとせずに、正確に何が返されているかを把握する唯一の方法のようです。

明確にするために:テーブルのタイプやそのような静的なものを伝える方法について尋ねているのではありません。sp_help のようなものは役に立たないと確信しています。SQL サーバーの型 (つまり、varchar(25)、int...) が与えられたものであるかどうかを確認する方法を尋ねています。さらに、sprocs の実装を変更することはできないため、ソリューションでそれを考慮してください。どこかで見逃したコマンドがあることを本当に望んでいます。すべてに感謝します。

更新 私が本当に求めているのは、結果セットが一時テーブルを使用したクエリから発生した場合に、結果セットのスキーマを取得する方法だと思います。これが不可能であることは理解していますが、データが送信されているため、その結論にはあまり意味がありません。問題を引き起こすストアド プロシージャの例を次に示します。

CREATE PROCEDURE [dbo].[IReturnATempTable]
AS

Create table #TempTable 
( 
    MyMysteryColumn char(50)
)

INSERT #TempTable (
    MyMysteryColumn
) VALUES ( 
    'Do you know me?' ) 


select TOP 50 * FROM #TempTable 
4

6 に答える 6

2

パラメータに基づいて異なる結果セットを返すストアド プロシージャについてどうしますか?

いずれの場合でも、SqlDataAdapter.SelectCommand を必要なパラメーターと共に構成してから、FillSchema メソッドを呼び出すことができます。スキーマを決定できると仮定すると、正しい列名と型、およびいくつかの制約で構成された DataTable が得られます。

于 2009-06-22T19:29:41.603 に答える
2

SET FMTONLY ON (または OFF) をいじってみてください。BOL によると、これは「クライアントにメタデータのみを返します。実際にクエリを実行せずに、応答の形式をテストするために使用できます。」BCPがこれを使用しているため、これにはあなたが探しているものが含まれていると思います。(非常に奇妙なBCPの問題をデバッグしているときに、この設定に出くわしました。)

于 2009-06-22T19:52:01.810 に答える
1

プロシージャに別の選択を追加できますか?

その場合は、 sql_variant_property関数を使用して実行できる可能性があります。

Declare @Param Int
Set @Param = 30

Select sql_variant_property(@Param, 'BaseType')
Select sql_variant_property(@Param, 'Precision')
Select sql_variant_property(@Param, 'Scale')

この質問に投稿しました。

SQL サーバーの型 (つまり、varchar(25)、int...) が与えられたものであることを確認する方法を尋ねています。

次に、型、精度 (つまり、VarChar(25) の場合は 25)、およびパラメーターの位取りを出力できます。

それが役立つことを願っています... :)

于 2009-06-22T19:33:12.923 に答える
0

このコードはあなたを修正するはずです。レコードのないスキーマのみのデータセットを返します。このデータセットを使用して、列の DataType およびその他のメタデータを照会できます。後で必要に応じて、SqlDataAdapter を作成し、その Fill メソッド (IDataAdapter.Fill) を呼び出して、DataSet にレコードを設定できます。

private static DataSet FillSchema(SqlConnection conn)
{
    DataSet ds = new DataSet();
    using (SqlCommand formatCommand = new SqlCommand("SET FMTONLY ON;", conn))
    {
        formatCommand.ExecuteNonQuery();
        SqlDataAdapter formatAdapter = new SqlDataAdapter(formatCommand);
        formatAdapter.FillSchema(ds, SchemaType.Source);
        formatCommand.CommandText = "SET FMTONLY OFF;";
        formatCommand.ExecuteNonQuery();
        formatAdapter.Dispose();
    }
    return ds;
}
于 2015-04-28T22:23:27.307 に答える
0

T-SQL に限定されておらず、明らかにSPの実行を気にしない場合 (SET FMTONLY ON完全に信頼できるわけではないため) 、. SqlDataReader次に、 を調べてSqlDataReader、列とデータ型を取得します。また、複数の結果セットがある場合、この環境から次の結果セットに簡単に移動することもできます。

于 2009-06-22T20:43:34.387 に答える