2012-03-07 21 views
14

Estoy escribiendo una función que devuelve una tabla. Hay dos parámetros que se pasan a la función y una consulta se genera y ejecuta y se inserta en la tabla de retorno. Sin embargo, estoy recibiendo este error.Llamar SQL dinámico desde la función

Solo se pueden ejecutar funciones y algunos procedimientos almacenados extendidos desde una función.

Me gustaría no utilizar un procedimiento almacenado ya que esta es una función de utilidad simple. ¿Alguien sabe si esto se puede hacer? Mi función está codificada a continuación, comprueba para ver si hay una determinada columna dentro de una determinada tabla.

-- ============================================= 
-- 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 

Respuesta

21

You can't use dynamic sql in a udf:

Esta muy simple: no se puede utilizar SQL dinámico desde utilizados-definidos funciones escritas en T-SQL. Esto se debe a que no está permitido hacer cualquier cosa en una UDF que pueda cambiar el estado de la base de datos (ya que la UDF puede llamar a como parte de una consulta). Como puede hacer cualquier cosa desde SQL SQL, incluidas las actualizaciones, es obvio por qué no se permite el SQL dinámico .

...

En SQL 2005 y más tarde, se podría poner en práctica su función como función CLR . Recuerde que todos los accesos a datos desde el CLR son SQL dinámicos. (Estás a salvo, de modo que si realizas una operación de actualización desde tu función, quedarás atrapado.) Sin embargo, una palabra de advertencia: el acceso a los datos desde las UDF escalares puede ocasionar problemas de rendimiento.

+0

¿Cómo puedo hacer de esto una función CLR? – JBone

+0

[Cómo crear y ejecutar una función definida por el usuario de CLR SQL Server]] (http://msdn.microsoft.com/en-us/library/w2kae45k (v = vs.80) .aspx) –

+1

'Dado que usted puede hacer cualquier cosa desde SQL dinámico, incluidas las actualizaciones, es obvio por qué SQL dinámico no está permitido. ', eso es correcto. Pero al mismo tiempo tiene que analizar su sql dinámico con, por ejemplo. sp_executesql(), por lo que SQL Server tiene todas las posibilidades de detectar datos cambiando consultas y dejar pasar a otros. Entonces, ¿cuál es el verdadero motivo? ¿No se molestaron en implementarlo? –

Cuestiones relacionadas