我正在编写一个返回表格的函数。有两个参数传递给函数,构建并执行查询并将其插入到返回表中。但是我收到了这个错误。
只能在函数内执行函数和某些扩展存储过程。
我不想使用存储过程,因为这是一个简单的实用函数。有谁知道这是否可以做到。我的函数在下面编码,它检查某个表中某个列的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
答案 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的访问通常会带来性能问题。