2016-07-07 7 views
0

関数へのユーザーの入力に応じて、テーブル値関数の列に名前を付ける方法はありますか?テーブル値関数、動的列名

いくつかの機能があるとします

foo(1,2,3) 

だから、3つの整数の入力を取り。テーブルの列名を '1 some text'、 '2 some text'、 '3 some text'のように返すとします。

これは可能ですか?

+0

あなたは関数引数をaとして追加しようとしましたか?結果セットのlias名!? – Lucky

+0

私はそれについて考えなかった、それを試してみましょう。 –

+0

その構文は何ですか?これはうまくいかないようです:INSERT INTO \ @Table SELECT \ @ parameter1 as(\ @ parameter1 + 'some text') –

答えて

1

をSPを作成してみてください、

CREATE PROCEDURE Foo(@Input1 INT, @Input2 INT, @Input3 INT) AS 
DECLARE @X VARCHAR(100) 

SET @X = 'Select ' + 'Id ' + ' AS [' + convert(varchar(10), @Input1) + 'SomeText]' + 
', FirstName ' + ' AS [' + convert(varchar(10), @Input2) + 'SomeText' + ']' + 
', LastName ' + ' AS [' + convert(varchar(10), @Input3) + 'SomeText' + ']' + 
     ' From Emp' 

EXEC (@X) 

GO 

Foo 1, 2, 3 
0

これは動的SQLを使用することで実現できますが、関数内で使用することはできません。あなたはSPのアプローチが必要な場合は、使用してそれを拡張することができます。..

0

番号テーブル値関数 - マルチステートメントのTVF、インラインTVF、またはSQLCLR TVF - - 一貫性のある/決定論的な結果セットを返す必要があります。これは、常に同じデータ型を返す必要があるScalar UDF(T-SQLおよびSQLCLR)に似ています。

実際、TVFのタイプに関係なく、TVFによって返される結果セットは、TVFの作成時にシステムメタデータで定義され、実行時には変更できません。あなたは次のクエリを使用して定義を見ることができます:

SELECT so.type_desc AS [ObjectType], so.[name] AS [ObjectName], sc.* 
FROM sys.columns sc 
INNER JOIN sys.objects so 
     ON so.[object_id] = sc.[object_id] 
WHERE so.type_desc NOT IN ('SYSTEM_TABLE', 'USER_TABLE', 'INTERNAL_TABLE', 
          'VIEW', 'TYPE_TABLE') 
ORDER BY so.[type_desc], so.[name], sc.column_id; 

ObjectTypeためには、以下の値を持つエントリを取り戻すことができます。

  • CLR_TABLE_VALUED_FUNCTION
  • SQL_INLINE_TABLE_VALUED_FUNCTION
  • SQL_TABLE_VALUED_FUNCTION