Chiama SQL dinamico dalla funzione

Sto scrivendo una funzione che restituisce un tavolo. Ci sono due parametri che vengono passati alla funzione e una query viene creata ed eseguita e inserita nella tabella di ritorno. Tuttavia sto ricevendo questo errore.

Solo funzioni e alcune stored procedure estese possono essere eseguite all’interno di una funzione.

Mi piacerebbe non utilizzare una procedura memorizzata in quanto si tratta di una semplice funzione di utilità. Qualcuno sa se questo può essere fatto. La mia funzione è codificata di seguito, controlla i duplicati per una determinata colonna all’interno di una certa tabella.

-- ============================================= -- AUTHOR: JON AIREY -- THIS FUNCTION WILL RETURN A COUNT OF HOW MANY -- TIMES A CERTAIN COLUMN VALUE APPEARS IN A -- TABLE. THIS IS HELPFUL FOR FINDING DUPES. -- THIS FUNCTION WILL ACCEPT A COLUMN NAME, TABLE -- NAME (MUST INCLUDE SCHEMA), AND OPTIONAL -- DATABASE TO USE. RESULTS WILL BE RETURNED AS -- A TABLE. -- ============================================= ALTER FUNCTION [dbo].[fn_FindDupe] ( -- Add the parameters for the function here @Column VARCHAR(MAX), @Table VARCHAR(100), @Database VARCHAR(100) = '' ) RETURNS @TempTable TABLE ([Column] varchar(100) ,[Count] int) AS BEGIN DECLARE @SQL VARCHAR(MAX) SET @Table = CASE WHEN @Database = '' THEN @Table ELSE @Database + '.' + @Table END SET @SQL = ' INSERT INTO @TempTable SELECT ' + @Column + ' ,COUNT(' + @Column + ') AS CNT FROM ' + @Table + ' GROUP BY ' + @Column + ' ORDER BY CNT DESC ' EXEC SP_EXECUTESQL @SQL RETURN END GO 

Non è ansible utilizzare SQL dinamico in un udf :

Questo molto semplice: non è ansible utilizzare l’SQL dinamico da funzioni definite dall’utente scritte in T-SQL. Questo perché non ti è permesso fare nulla in una UDF che potrebbe cambiare lo stato del database (dato che l’UDF può essere invocato come parte di una query). Poiché è ansible eseguire qualsiasi operazione dall’SQL dinamico, inclusi gli aggiornamenti, è ovvio il motivo per cui SQL dinamico non è consentito.

In SQL 2005 e versioni successive, è ansible 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 dalla tua funzione, verrai catturato.) Una parola di avvertimento però: l’accesso ai dati da UDF scalari può spesso dare problemi di prestazioni.