从函数调用dynamicSQL

我正在写一个函数返回一个表。 有两个parameter passing给函数,并且构build并执行查询并将其插入返回的表中。 但是我收到这个错误。

只有函数和一些扩展存储过程可以在一个函数内执行。

我想不使用存储过程,因为这是一个简单的实用程序function。 有谁知道这是否可以做到。 我的函数编码如下,它检查某个表内的某个列的愚蠢行为。

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

你不能在udf中使用dynamicsql :

这非常简单:您不能使用从T-SQL编写的用过定义的函数的dynamicSQL。 这是因为您不允许在UDF中执行任何可以更改数据库状态的任何操作(因为可能会将UDF作为查询的一部分进行调用)。 由于您可以从dynamicSQL(包括更新)执行任何操作,因此很明显为什么不允许使用dynamicSQL。

在SQL 2005和更高版本中,您可以将您的函数实现为CLR函数。 回想一下,CLR的所有数据访问都是dynamicSQL。 (你是安全的,所以如果你从你的函数中执行一个更新操作,你将会被捕获。)一个警告的话:从标量UDFs访问数据通常会带来性能问题。