gpt4 book ai didi

sql - 从函数调用动态SQL

转载 作者:行者123 更新时间:2023-12-03 14:47:13 25 4
gpt4 key购买 nike

我正在写一个返回表的函数。有两个参数传递给该函数,并生成并执行查询并将其插入返回表中。但是,我收到此错误。


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


我不想使用存储过程,因为这是一个简单的实用程序功能。有谁知道这是否可以做到。我的函数编码如下,它检查特定表中特定列的重复项。

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

最佳答案

You can't use dynamic sql in a udf


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

...

在SQL 2005和更高版本中,您可以将功能实现为CLR
功能。回想一下,从CLR进行的所有数据访问都是动态SQL。
(您受到安全保护,因此,如果您从
您的功能,就会被抓住。
标量UDF的访问通常会带来性能问题。

关于sql - 从函数调用动态SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9607935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com