SQL Server 中 UDF 的动态表

Posted

技术标签:

【中文标题】SQL Server 中 UDF 的动态表【英文标题】:Dynamic tables from UDF in SQL Server 【发布时间】:2009-10-16 14:40:20 【问题描述】:

我该如何决定这个问题?

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[GetDataById] ()
RETURNS INT
AS
BEGIN
  DECLARE @query NVARCHAR(500)
  DECLARE @j INT
  SET @query=N'select * from catalog'
  EXEC sp_executesql @query
  RETURN @j
END

当我尝试执行这个时:select dbo.GetDataById()

我收到一条错误消息:

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

【问题讨论】:

你到底想做什么?这个功能没有意义。 【参考方案1】:

来自this post,由 SQL Server MVP Erland Sommarskog 撰写:

您不能使用来自 编写的使用定义函数 T-SQL。这是因为你不是 允许在 UDF 中执行任何 可以改变数据库状态(如 UDF 可以作为 询问)。因为你可以做任何事情 动态 SQL,包括更新,它是 很明显为什么动态 SQL 不是 允许。

【讨论】:

【参考方案2】:

您不能在函数中使用动态创建的 SQL。您必须为此使用存储过程。

但在您的情况下,我不明白您为什么还要将查询放入变量中。

【讨论】:

这只是一个例子.. 我有太多的长请求(超过 4000 个符号),数据库中有超过 2000 个表,并且很多查询是不确定的,其中大部分是即时生成的。 . 那么,你需要存储过程。 除非您还需要加入结果并在SELECT 语句中使用它们。那么你要么不知所措,要么陷入了一些非常丑陋的解决方案。

以上是关于SQL Server 中 UDF 的动态表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 查询中的动态表名和变量名

Sql Server备份表,动态生成表名称

Sql Server备份表,动态生成表名称

sql server存储过程如何动态生成表名

SQL Server - 动态数据透视表 - SQL 注入

SQL Server StoredProc 与 UDF 内联表