0

语境:

假设我有一个大查询(伪):

SELECT %boundthing,data
WHERE data in (
    ...do lots of long-running stuff
)

让我们假设boundthing在我的查询中没有使用,但是当我想打印输出时(我知道这是一个愚蠢的用例,但它说明了我知道在子句运行boundthing之后才需要的点)。WHERE

实际上,如果我boundthing以我选择的编程语言将值传递给我的查询,则在我触发查询时会对其进行评估,而不管数据库实际“使用”多久。

问题:

有没有办法(在现有的数据库/编程语言中)根据需要设置要评估的绑定样式的事物(即,它为绑定变量生成一个值,无论源是变量还是函数)查询,而不是查询计划何时建立?

例如,我可以在应用程序伪代码中说:

function MyFunc:
    return "foo" + system.GetEpochTimestamp();

var results = database_handle.Execute( SQL = "
    SELECT %boundthing,data
    WHERE data in (
        ...do lots of long-running stuff
    )", BINDS = [ ("boundthing", MyFunc ) ]
);

并且输出中“boundthing”的值将对应于应用程序服务器上的时间戳,在 WHERE 子句过滤所有内容之后(减去myfunc应用程序服务器上的运行时间,以及数据到达数据库服务器所需的时间)并由数据库处理)。

为什么我想知道:

好奇心。

我知道这样的事情可能会破坏查询计划器提供的很多(可能是全部)效率。我知道您永远无法保证绑定的评估将在查询中需要值时准确执行(存在值传输时间、数据库处理时间等)。我也知道它违反了许多原子性保证,并且在中止或中断的情况下可能会导致严重的问题。

不过,我很好奇。

4

1 回答 1

1
CREATE PROC MyFunc
AS
BEGIN
    SELECT * INTO #MyTempTable FROM data where data in ( ...do lots of long-running stuff);
    $boundthing='EXEC boundthing'
    select $boundthing, * from #MyTempTable
END
GO

希望对扎克有所帮助。

-皮特

于 2013-03-27T00:27:00.023 回答