如何创建一个接受查询字符串并返回查询结果集的 UDF

Posted

技术标签:

【中文标题】如何创建一个接受查询字符串并返回查询结果集的 UDF【英文标题】:How to create a UDF that takes a query string and returns the query's resultset 【发布时间】:2009-04-24 16:46:58 【问题描述】:

我想创建一个存储过程,它采用简单的 SELECT 语句并将结果集作为 CSV 字符串返回。所以基本思想是从用户输入中获取 sql 语句,使用 EXEC(@stmt) 运行它并使用游标将结果集转换为文本。但是,由于 SQLServer 不允许:

从存储过程中选择 *(@sqlStmt) UDF 与 EXEC(@sqlStmt)

所以我尝试插入 #tempTable EXEC(@sqlStmt),但这不起作用(错误 = “无效的对象名称 #tempTable”)。

我被困住了。能否请您解释一下这个问题?

非常感谢

编辑:

实际上输出(例如 CSV 字符串)并不重要。问题是我不知道如何将游标分配给 EXEC 返回的结果集。 SP 和 UDF 不能与 Exec() 一起使用,而在不知道输入语句的情况下,在插入值之前创建临时表是不可能的。

我想到了 OPENQUERY,但它不接受变量作为参数。

【问题讨论】:

“如何跑步” - 站起来开始快速行走。不断提高速度,你很快就会发现自己在奔跑!提示:下次选择更好的标题! 您实际上是否已经编写过一个函数,该函数根据动态评估的任意 SQL 字符串返回 CSV? 【参考方案1】:

在插入存储过程之前,您需要创建具有与存储过程返回的相同列的临时表。

但是,输出到 CSV 听起来并不是特别适合 SQL 的工作。您是否仅限于使用存储过程,或者您可以编写脚本或程序来获取结果并存储在 CSV 中?这可能是一种整体上更简单的方法。

【讨论】:

【参考方案2】:

如果我没记错的话,您需要一个接受 SELECT 语句并返回结果的存储过程,可选的为 CSV。

所以 EXEC prExecute 'select * from tablea' 是您想要调用的? 那是相当东部:

CREATE PROC prExecute ( @sql varchar(2000))
AS
    EXEC (@sql);
GO

但我不明白这里需要光标。

【讨论】:

以上是关于如何创建一个接受查询字符串并返回查询结果集的 UDF的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL如何查询记录集的前3条记录

如何在 SQL 查询中获取结果集的字节大小?

oracle中结果集的交集并集差集组合查询

创建一个接受字符串并返回多行的函数

如何使用 Django 中另一个查询集的结果过滤查询集?

如何将查询的结果集转换为可以进一步解析以创建json的pojo类?