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
¿Cómo puedo hacer de esto una función CLR? – JBone
[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) –
'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? –