函数中的变量表或列名

时间:2011-12-09 21:46:37

标签: sql-server-2008-r2 user-defined-functions dynamic-sql

我正在尝试搜索数据库中的所有表和列,即here。建议的技术是构造SQL查询字符串,然后执行它们。这很好,作为存储过程。 (变量表/列名称的另一个例子是here。再次,EXEC用于执行“动态SQL”。)

但是,我的应用程序要求我在一个函数中执行此操作,而不是SP。 (我们的开发框架无法从SP获取结果。)但是在函数中,至少在SQL Server 2008 R2上,您不能使用EXEC;我收到这个错误:

Invalid use of a side-effecting operator 'INSERT EXEC' within a function.

根据this post, apparently by a Microsoft developer的答案,这是设计的;它与INSERT无关,只是当你执行动态构造的SQL代码时,解析器不能保证缺少副作用。因此,它不允许您创建这样的功能。

那么......有没有办法迭代函数中的许多表/列?

我从BOL看到

  

以下陈述在函数中有效:...

     
      
  • EXECUTE   调用扩展存储过程的语句。
  •   

嗯 - 如何延长SP的副作用?

但无论如何这对我没有帮助:

  

扩展存储过程,从内部调用时   功能,无法将结果集返回给客户端。任何ODS API   将结果集返回给客户端将返回FAIL。扩展存储   过程可以连接回SQL Server实例;但是,它   不应该尝试加入与该函数相同的事务   调用了扩展存储过程。

由于我们需要函数来返回搜索结果,因此ESP无济于事。

我真的不想进入扩展的SP:在环境中增加编程语言的数量会使我们的开发环境变得更加复杂。

我现在可以想到一些解决方案,其中没有一个是非常令人满意的:

  • 首先调用生成所需数据的SP并将其放入表中,然后从仅从表中读取结果的函数中选择;如果搜索需要一段时间并且两个用户的搜索重叠,则可能会出现问题。或者,
  • 让应用程序(不是函数)生成一个长查询,命名db中的每个表和列名。我想知道JDBC驱动程序是否可以处理很长的查询。或者,
  • 让应用程序(不是函数)生成一系列简短的查询,命名db中的每个表和列名。这将使整体搜索速度变慢。

感谢您的任何建议。

P.S。经过进一步搜索,我偶然发现了与this question密切相关的内容。它没有答案。

更新:不再需要

我认为这个问题仍然有效,我们可能会再次出现需要它的情况。但是,对于目前的问题,我不再需要答案了。经过多次尝试和错误后,我设法让我们的应用程序框架通过存储过程中的JDBC驱动程序从RDBMS检索行结果。因此,不需要将该东西作为一种功能工作。

但是,如果有人在这里发布了有助于解决所述问题的答案,我将乐意在适当的时候进行投票和/或接受。

1 个答案:

答案 0 :(得分:0)

sp基本上是一个带有一些附加功能的预定义sql语句。

所以,如果你有 伪代码

Create SP_DoSomething As
  Select * From MyTable
END

您无法使用SP

然后你只需按照"选择*来自MyTable"

执行SQL

至于那个naff sql代码。 首先,您可以使用where子句将表连接到列,如果有的话,可以逐行删除。

提出另一个问题。就像这怎么可以改进,有更多的尝试范围比我的更多。