web-dev-qa-db-ja.com

SSDTの結果セットのすべてのフィールドのデータ型を確認するにはどうすればよいですか?

SQL Serverデータツール(SSDT)でテーブル値関数を書いています。 テーブル値関数では、返されるテーブルのデータ型を明示的に指定する必要があります。私の特定のケースでは、必要な値を返すクエリを作成しました。 SSDTを使用して実行できますが、返される列のデータ型をすばやく判別する方法がわかりません。

ReturnTableの列のリストをすばやく正確に入力できるように、返される列のリストとその列のデータ型を取得する方法はありますか?

私が得た最も近いのは、SELECT句のフィールド名にカーソルを合わせることですが、これには長さや精度の制限はありません。

enter image description here

編集:テーブル値関数に関するコメントを取り消しましたが、@ srutkzyの回答に基づいて、返されたテーブルの列のデータ型を明示的に指定する必要があります。ありがとう!

2
Mark Iannucci

テーブル値関数では、返されるテーブルのデータ型を明示的に指定する必要があります。

そのステートメントは必ずしも正しいとは限りません。はい、複数ステートメントのTVFでは、戻りテーブルを宣言する必要があります。ただし、インラインTVFは単一のクエリ(基本的には入力パラメーターを受け入れるビュー)をカプセル化するだけなので、テーブル定義は必要ありません。詳細については、MSDNページの CREATE FUNCTION を参照してください。

インラインTVFがマルチステートメントTVFよりもmuchより効率的であることを考えると、最初の質問は、このクエリをインラインTVFで実行できるかどうかです。はいの場合は、インラインTVFにして、テーブル構造を定義する必要はありません。

インラインTVFとして操作を実行できない場合は、ベーステーブルからデータ型を取得する必要があります。次のいずれかを使用できます。

EXEC sp_help 'SchemaName.TableName';
-- for NVARCHAR / NCHAR, use Length/2 to get the size

または:

SELECT col.*
FROM   INFORMATION_SCHEMA.COLUMNS col
WHERE  col.TABLE_SCHEMA = N'SchemaName'
AND    col.TABLE_NAME = N'TableName';
-- for NVARCHAR / NCHAR, use CHARACTER_MAXIMUM_LENGTH to get the size
1
Solomon Rutzky

SELECT..INTO構文を使用してオンザフライでテーブルを作成し、sys.columnsで結果の列定義を調べることができます。

select
  *
into #SomeName
from <your query goes here>
where 1=0 -- because we only want the metadata

thinksys.columnsにも関数の定義がありますが、今チェックするために渡すインスタンスがありません。または、関数に入力しようとしているのと同じクエリでビューを作成し、カタログを確認することもできます。

1
Michael Green