列名を使用して列のデータ型を取得する必要があります。C#でコーディングしています。状況は、いくつかの日付を varchar に変換するビューがあるため、それらをより適切に表示できます (正確には時間がかかりません)。ただし、これは列のデータ型が正しくないことを意味します。私がしたいのは、列名を使用して DataTable スキーマから列を検索し、その列のデータ型を取得することです。この場合、ビューではなくメイン テーブルから実際のデータ型を収集します。アイデア?
4 に答える
DataTable.Columns
プロパティは、DataColumnCollection
であり、列名でインデックスを付けDataColumn
て、プロパティを持つを取得できDataType
ます。
information_schema.columnsテーブルは、 sys.columnsテーブルよりも必要なものについてより明確な情報を提供します。次のことを試すことができます。
SELECT data_type, character_maximum_length
FROM information_schema.columns
WHERE table_name = 'tableName' AND column_name = 'columnName'
値から型を推測しないと、それがどのように可能かわかりません。ビューからの結果とコード内の列名がある場合、ビューが使用するテーブルに関する情報はその時点で失われます。
もちろん、テーブルの名前がわかっている場合は、そのテーブルに関する情報を取得できます。次のような単純なクエリを使用して実現できます。
SELECT TOP 0 * FROM <<tableName>>
または DMV を使用する場合:
SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('<<tableName>>')
最初のケースでは、IDataReader で GetSchemaTable を使用し、行を反復処理して名前で列を見つけます。2 番目のケースでは、結果セット自体を反復処理して、その方法で列を見つけることができます。
SQL Server を使用している場合は、SET FMTONLY を使用できます。メタデータのみをクライアントに返します。実際にクエリを実行せずに、応答の形式をテストするために使用できます。
SqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "SET FMTONLY ON; select column from table; SET FMTONLY OFF";
SqlDataReader reader = cmd.ExecuteReader();
SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"];
礼儀: StackOverflow