我正在尝试搜索数据库中的所有表和列,即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:在环境中增加编程语言的数量会使我们的开发环境变得更加复杂。
我现在可以想到一些解决方案,其中没有一个是非常令人满意的:
感谢您的任何建议。
P.S。经过进一步搜索,我偶然发现了与this question密切相关的内容。它没有答案。
我认为这个问题仍然有效,我们可能会再次出现需要它的情况。但是,对于目前的问题,我不再需要答案了。经过多次尝试和错误后,我设法让我们的应用程序框架通过存储过程中的JDBC驱动程序从RDBMS检索行结果。因此,不需要将该东西作为一种功能工作。
但是,如果有人在这里发布了有助于解决所述问题的答案,我将乐意在适当的时候进行投票和/或接受。
答案 0 :(得分:0)
sp基本上是一个带有一些附加功能的预定义sql语句。
所以,如果你有 伪代码
Create SP_DoSomething As
Select * From MyTable
END
您无法使用SP
然后你只需按照"选择*来自MyTable"
执行SQL至于那个naff sql代码。 首先,您可以使用where子句将表连接到列,如果有的话,可以逐行删除。
提出另一个问题。就像这怎么可以改进,有更多的尝试范围比我的更多。