SQL Serverデータツール(SSDT)でテーブル値関数を書いています。 テーブル値関数では、返されるテーブルのデータ型を明示的に指定する必要があります。私の特定のケースでは、必要な値を返すクエリを作成しました。 SSDTを使用して実行できますが、返される列のデータ型をすばやく判別する方法がわかりません。
ReturnTable
の列のリストをすばやく正確に入力できるように、返される列のリストとその列のデータ型を取得する方法はありますか?
私が得た最も近いのは、SELECT
句のフィールド名にカーソルを合わせることですが、これには長さや精度の制限はありません。
編集:テーブル値関数に関するコメントを取り消しましたが、@ srutkzyの回答に基づいて、返されたテーブルの列のデータ型を明示的に指定する必要があります。ありがとう!
テーブル値関数では、返されるテーブルのデータ型を明示的に指定する必要があります。
そのステートメントは必ずしも正しいとは限りません。はい、複数ステートメントの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
SELECT..INTO
構文を使用してオンザフライでテーブルを作成し、sys.columns
で結果の列定義を調べることができます。
select
*
into #SomeName
from <your query goes here>
where 1=0 -- because we only want the metadata
私thinksys.columns
にも関数の定義がありますが、今チェックするために渡すインスタンスがありません。または、関数に入力しようとしているのと同じクエリでビューを作成し、カタログを確認することもできます。