2015-09-30 11 views
5

procedura FunctionX, Linea 345trucchi per eseguire stringa all'interno di una funzione in SQL Server

Utilizzo non valido di un operatore laterale effettuando 'ESEGUIRE STRING' all'interno di una funzione .

ottengo l'errore precedente quando eseguo una dichiarazione dinamica all'interno di una funzione in SQL Server 2012. Esiste una soluzione per questo? Qualche trucco?

PS: lo sproc (procedura memorizzata) è troppo lungo perché il corpo venga inserito così com'è all'interno della funzione.

DECLARE @execsql NVARCHAR(2000) 
Set @execsql = 'INSERT INTO @TABLE1 EXEC SPROC1 ' + @ID_COMPANY + ',' + @ID_COUNTRY 
exec (@execsql) 

Molte grazie in anticipo.

Inoltre, devo essere in grado di eliminare anche all'interno della funzione. So che questo contraddice la definizione delle funzioni, ma mi chiedo se ci sono alcuni trucchi che possono essere utilizzati

+0

La domanda più grande è perché pensi che sia necessario utilizzare una funzione qui? Una funzione è progettata per restituire un singolo valore, non è una stored procedure che è ciò che stai descrivendo. –

risposta

6

Non c'è niente trucchi, vedere The Curse and Blessings of Dynamic SQL

SQL dinamico a funzioni definite dall'utente

Questo molto semplice: non è possibile utilizzare l'SQL dinamico dalle funzioni definite in scrittura in T-SQL. Ciò è dovuto al fatto che non è consentito eseguire in una UDF che potrebbe modificare lo stato del database (poiché l'UDF può essere invocato come parte di una query come ). Poiché è possibile eseguire qualsiasi operazione da SQL dinamico , inclusi gli aggiornamenti, è ovvio il motivo per cui SQL dinamico non è consentito.

Ho visto più di un post sui newsgroup in cui le persone sono state sbattendo la testa contro questo. Ma se si desidera utilizzare l'SQL dinamico in un UDF, eseguire il back-out e ripetere il progetto. Hai colpito un roadblock e in SQL 2000 non c'è via d'uscita.

In SQL 2005 e versioni successive, è possibile implementare la funzione come funzione CLR . Ricorda che tutti gli accessi ai dati da CLR sono SQL dinamici. (Sei protetto, così se esegui un'operazione di aggiornamento da alla tua funzione, verrai catturato.) Una parola di avvertimento però: l'accesso ai dati dalle UDF scalari può spesso dare problemi di prestazioni. Se dici

SELECT ... FROM tbl DOVE dbo.MyUdf (somecol) = @value

e MyUdf esegue l'accesso ai dati, è stato più o meno creato una nascosta cursore.