2009-06-12 11 views
5

Ho una UDF che richiede dati su una tabella. La tabella, tuttavia, deve essere definita come parametro. Per esempio io non posso avere:.Utilizzo di una variabile per il nome tabella nella clausola 'Da' in SQL Server 2008

Select * From [dbo] [Tabella A]

ho bisogno di qualcosa come:.

Select * From [dbo] [@ TableName]

La riga precedente non funziona e anche l'UDF mi impedisce di impostare la query come stringa e chiamare exec(). Posso farlo in una procedura, ma non posso neanche richiamare la procedura dall'UDF.

Qualcuno sa come posso realizzare questo all'interno dell'UDF senza avere una sorta di dichiarazione di commutazione massiccia?

+0

Stavo cercando di fare la cosa esatta l'altro giorno senza fortuna. Spero che qualcuno lo sappia! – Gabe

risposta

7

Questo non può essere fatto, SQL dinamico non è supportata nelle funzioni.

Vai a questa domanda SO: Executing dynamic SQL in a SQLServer 2005 function

+0

Grazie per il link! – DaveK

+1

Questa risposta è corretta quando si usano le normali UDF (che è ciò che ho chiesto riguardo). Sono stato in grado di risolvere il mio problema con un UDF CLR scritto in C#. – DaveK

3

È possibile scrivere un CLR UDF che può fare SQL dinamico. Ho dovuto implementarlo prima. È piuttosto lucido.

+0

Giusto, ma questa sarebbe una funzione CLR estesa, non una UDF? – Andomar

+0

Può essere utilizzato in una query come può fare un UDF? – DaveK

+0

Sì, ma il tuo DBA deve accettare di abilitare il supporto CLR e devi distribuirli come compilato in .NET asseritamente http://msdn.microsoft.com/en-us/library/ms254498(VS.80).aspx – Andomar

5

È possibile UNION TUTTE le tabelle e includere il nome della tabella come colonna, quindi specificare il nome della tabella come predicato su questo. Se controlli il piano di query per questo esempio, vedi che t2 non viene toccato

create table t1 (i int) 
create table t2 (i int) 

insert t1 values(1) 
insert t1 values(2) 
insert t1 values(3) 
insert t2 values(4) 
insert t2 values(5) 
insert t2 values(6) 


;with tableSet as (
    select i, 't1' as tableName from t1 
    union all select i, 't2' as tableName from t2 
) 
select i from tableSet where tableName = 't1' 
+0

+1 la domanda esclude un approccio di "switch switch di grandi dimensioni" tho – Andomar

+0

@Andomar, ho pensato che fosse un po 'meno "permissivo" di un gruppo di if/else blocks. Per esempio. questo insieme di tabelle per UNION ALL potrebbe essere racchiuso in una vista se avessi molte funzioni che necessitavano della funzionalità, che non potevi fare con if/else. Punto preso però;) – ahains

0

Non puoi farlo. Quale problema stai risolvendo, potrebbero esserci altre soluzioni.

21
SET @SQL = 'SELECT * FROM ' + @table 
EXEC (@SQL) -- parentheses are required 
+2

Sii gentile sapere perché questo ha ottenuto un voto negativo .... – johnnycrash

+0

Potresti aver ottenuto un voto negativo perché questo ti lascia aperto a un attacco di SQL Injection a seconda di come usi questa query. EDIT: Ho appena notato che DaveK ha detto che non può farlo nella domanda - Probabilmente è da lì che è arrivato il tuo downvote. –

0

Se volete dare maggiori dettagli su ciò che problema di fondo che si sta tentando di risolvere, potremmo avere risposte migliori. Una soluzione è quella di generare codice UDF su una base per tabella. Un altro è usare SQL dinamico da un SP. Ciò che è giusto per la tua situazione è difficile da dire.

Problemi correlati