从函数调用动态SQL

时间:2012-03-07 19:38:13

标签: sql tsql function dynamic

我正在编写一个返回表格的函数。有两个参数传递给函数,构建并执行查询并将其插入到返回表中。但是我收到了这个错误。

  

只能在函数内执行函数和某些扩展存储过程。

我不想使用存储过程,因为这是一个简单的实用函数。有谁知道这是否可以做到。我的函数在下面编码,它检查某个表中某个列的dupes。

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

1 个答案:

答案 0 :(得分:22)

You can't use dynamic sql in a udf

  

这很简单:你不能使用来自used-defined的动态SQL   用T-SQL编写的函数。这是因为你不被允许这样做   UDF中可以改变数据库状态的任何东西(如UDF可能的那样)   作为查询的一部分被调用)。既然你可以做任何动态的事情   SQL,包括更新,很明显为什么动态SQL不是   允许的。

     

...

     

在SQL 2005及更高版本中,您可以将您的功能实现为CLR   功能。回想一下,CLR的所有数据访问都是动态SQL。   (你是安全保护的,所以如果你执行更新操作   你的功能,你会被抓住。)尽管有一个警告:数据   标量UDF的访问通常会带来性能问题。