2016-07-07 8 views
0

Gibt es eine Möglichkeit, die Spalte in einer Tabellenwertfunktion zu benennen, abhängig von der Eingabe des Benutzers für die Funktion?Tabellenwertige Funktionen, dynamische Spaltennamen

Angenommen, es gibt eine Funktion:

foo(1,2,3) 

So dauert es drei Integer-Eingänge. Nun nehme ich an, dass ich die Spaltennamen in der Tabelle wie folgt zurückgeben möchte: '1 ein Text', '2 ein Text', '3 ein Text'.

Ist das möglich?

+0

Haben Sie versucht, die Funktionsargumente als a anzuhängen? Lias Namen in der Ergebnismenge !? – Lucky

+0

nein. Ich habe nicht darüber nachgedacht, lass mich das versuchen. –

+0

Was ist die Syntax dafür? das scheint nicht zu funktionieren: INSERT INTO \ @Tabelle SELECT \ @ parameter1 als (\ @ parameter1 + 'irgendein Text') –

Antwort

1

Wenn Sie einen SP-Ansatz benötigen, können Sie erweitern Sie es,

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

Dies kann mit dynamischem SQL erreicht werden, aber denken Sie daran, dass Sie es nicht in einer Funktion haben können. Versuchen Sie, einen SP Erstellen ..

0

Nr Tabellenwertfunktionen - Multi-Anweisung TVF, Inline TVF oder SQLCLR TVF - - müssen eine konsistente/deterministische Ergebnismenge zurückgeben. Dies ist vergleichbar mit skalaren UDFs (T-SQL und SQLCLR), die immer den gleichen Datentyp zurückgeben müssen.

In der Tat, das Ergebnis von TVF, unabhängig von der Art der TVF zurückgegeben werden, ist in den System-Metadaten definiert, wenn die TVF erstellt wird, und kann nicht zur Laufzeit geändert werden. Sie können die Definitionen finden Sie in der folgenden Kriterien:

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; 

Für ObjectType Sie Einträge zurückbekommen können folgende Werte gelten:

  • CLR_TABLE_VALUED_FUNCTION
  • SQL_INLINE_TABLE_VALUED_FUNCTION
  • SQL_TABLE_VALUED_FUNCTION
Verwandte Themen