Inline表值函数中的SQL Server标量变量

时间:2014-02-18 09:33:38

标签: sql-server sql-server-2008 sql-function

我有一个multi statement table valued function,我想将其更改为inline table valued function以进行优化(我真的不知道这是否会进行优化,但我还是想尝试一下)。我的问题是我有一个scalar variable,我不知道如何填写我的WITH声明。

代码示例:

CREATE FUNCTION [dbo].[function]()
RETURNS 
  @return_table table (id INT,value NVARCHAR(500)) 
    AS
    BEGIN
      DECLARE @tmp_table        TABLE(id INT, value VARCHAR(500))
      DECLARE @variable     BIGINT
      INSERT INTO @tmp_table [...insert code...]
      SET @variable = (SELECT MAX(id) FROM @tmp_table)
    INSERT INTO @return_table SELECT id,value FROM @tmp_table WHERE id = @variable
RETURN

这段代码是一个例子,实际功能比较复杂但问题完全相同

我可以轻松地将此更改为单个WITH语句,如下所示:

CREATE FUNCTION  [dbo].[function]()
RETURNS TABLE
AS
RETURN 
(
    WITH tmp_table AS (
       SELECT [...Select Code...]
    )
    SELECT id,value FROM tmp_table 
    WHERE id = [variable]
);
GO

我的问题在于[variable],我不知道如何进入查询。另外,variable在我的函数中被多次使用,所以我不想只用查询替换它。

我也试过这种方法:

CREATE FUNCTION  [dbo].[function]()
RETURNS TABLE
AS
RETURN 
(
    WITH tmp_table AS (
       SELECT [...Select Code...]
    ), variable = (SELECT MAX(id) value FROM tmp_table)
    SELECT id,value FROM tmp_table 
    WHERE id = (SELECT TOP 1 value FROM variable)
);
GO

但似乎它使功能变慢了。

谢谢。

1 个答案:

答案 0 :(得分:1)

试试

WITH tmp_table AS (
   SELECT [...Select Code...]
)
SELECT id,value FROM tmp_table WHERE id = (SELECT MAX(id) FROM tmp_table)

我实际上只是将其改为

SELECT TOP 1 *
FROm [whatever]
ORDER BY id DESC