SQL 服务器/T-SQL: Return 来自构造的单个值 table
SQL Server / T-SQL: Return a single value from a constructed table
我正在编写一个内联函数,它接受固定数量的参数(在代码示例中为 9 个),将这些参数排列成一个具有 2 列和 4 行的构造 table,对 table,然后 returns 来自所述 table 的单个值(第 1 列中的值,以及调用语句请求的第 1-4 行中的值)。
我已经完成了大部分。
但我需要知道如何 select 末尾的特定列和行索引。
您可能会问为什么我为此需要一个内联函数,答案是因为 a) 排序是至关重要的,b) 这是在内存优化的计算列中使用的 table , 不允许子查询等
这是我目前的代码:
CREATE FUNCTION [dbo].[SelectOrderedInputValue]
(
-- 1-based row index of the desired return value
@RequestedRowIndex INT,
@InputValue1 INT,
@InputValue2 INT,
@InputValue3 INT,
@InputValue4 INT,
@InputRank1 INT,
@InputRank2 INT,
@InputRank3 INT,
@InputRank4 INT
)
RETURNS TABLE AS RETURN
(
/* Places the parameters into a table, and sorts by rank.
I need to figure out how to specify a row and column,
so I can return the single requested value from this table.
In this case, I need to return the value in column #1 (alias InputValues)
and row # @RequestedRowIndex*/
SELECT TOP 4 InputValues FROM
(VALUES
([InputValue1], [InputRank1]),
([InputValue2], [InputRank2]),
([InputValue3], [InputRank3]),
([InputValue4], [InputRank4])
) AS Inputs(InputValues, InputRanks) ORDER BY InputRanks ASC
)
试试 OFFSET FETCH
DECLARE @RequestedRowIndex INT=4
SELECT * FROM (
SELECT TOP 4 * FROM
(VALUES
(10, 11),
(20, 21),
(30, 31),
(40, 41)
) AS Inputs(InputValues, InputRanks)
ORDER BY InputRanks ASC )A
ORDER BY InputRanks ASC
OFFSET @RequestedRowIndex-1 ROWS FETCH NEXT 1 ROWS ONLY
没有必要为单个值 return table。只需使用标量函数:
CREATE FUNCTION [dbo].[SelectOrderedInputValue] (
-- 1-based row index of the desired return value
@RequestedRowIndex INT,
@InputValue1 INT,
@InputValue2 INT,
@InputValue3 INT,
@InputValue4 INT,
@InputRank1 INT,
@InputRank2 INT,
@InputRank3 INT,
@InputRank4 INT
) RETURNS INT AS
BEGIN
/* Places the parameters into a table, and sorts by rank.
I need to figure out how to specify a row and column,
so I can return the single requested value from this table.
In this case, I need to return the value in column #1 (alias InputValues)
and row # @RequestedRowIndex*/
DECLARE @retval INT;
SET @retval = (SELECT TOP 4 *
FROM (VALUES ([InputValue1], [InputRank1]),
([InputValue2], [InputRank2]),
([InputValue3], [InputRank3]),
([InputValue4], [InputRank4])
) Inputs(InputValues, InputRanks)
ORDER BY InputRanks ASC
OFFSET @RequestedRowIndex-1 FETCH FIRST 1 ROW ONLY
);
RETURN @retval;
END;
我正在编写一个内联函数,它接受固定数量的参数(在代码示例中为 9 个),将这些参数排列成一个具有 2 列和 4 行的构造 table,对 table,然后 returns 来自所述 table 的单个值(第 1 列中的值,以及调用语句请求的第 1-4 行中的值)。
我已经完成了大部分。
但我需要知道如何 select 末尾的特定列和行索引。
您可能会问为什么我为此需要一个内联函数,答案是因为 a) 排序是至关重要的,b) 这是在内存优化的计算列中使用的 table , 不允许子查询等
这是我目前的代码:
CREATE FUNCTION [dbo].[SelectOrderedInputValue]
(
-- 1-based row index of the desired return value
@RequestedRowIndex INT,
@InputValue1 INT,
@InputValue2 INT,
@InputValue3 INT,
@InputValue4 INT,
@InputRank1 INT,
@InputRank2 INT,
@InputRank3 INT,
@InputRank4 INT
)
RETURNS TABLE AS RETURN
(
/* Places the parameters into a table, and sorts by rank.
I need to figure out how to specify a row and column,
so I can return the single requested value from this table.
In this case, I need to return the value in column #1 (alias InputValues)
and row # @RequestedRowIndex*/
SELECT TOP 4 InputValues FROM
(VALUES
([InputValue1], [InputRank1]),
([InputValue2], [InputRank2]),
([InputValue3], [InputRank3]),
([InputValue4], [InputRank4])
) AS Inputs(InputValues, InputRanks) ORDER BY InputRanks ASC
)
试试 OFFSET FETCH
DECLARE @RequestedRowIndex INT=4
SELECT * FROM (
SELECT TOP 4 * FROM
(VALUES
(10, 11),
(20, 21),
(30, 31),
(40, 41)
) AS Inputs(InputValues, InputRanks)
ORDER BY InputRanks ASC )A
ORDER BY InputRanks ASC
OFFSET @RequestedRowIndex-1 ROWS FETCH NEXT 1 ROWS ONLY
没有必要为单个值 return table。只需使用标量函数:
CREATE FUNCTION [dbo].[SelectOrderedInputValue] (
-- 1-based row index of the desired return value
@RequestedRowIndex INT,
@InputValue1 INT,
@InputValue2 INT,
@InputValue3 INT,
@InputValue4 INT,
@InputRank1 INT,
@InputRank2 INT,
@InputRank3 INT,
@InputRank4 INT
) RETURNS INT AS
BEGIN
/* Places the parameters into a table, and sorts by rank.
I need to figure out how to specify a row and column,
so I can return the single requested value from this table.
In this case, I need to return the value in column #1 (alias InputValues)
and row # @RequestedRowIndex*/
DECLARE @retval INT;
SET @retval = (SELECT TOP 4 *
FROM (VALUES ([InputValue1], [InputRank1]),
([InputValue2], [InputRank2]),
([InputValue3], [InputRank3]),
([InputValue4], [InputRank4])
) Inputs(InputValues, InputRanks)
ORDER BY InputRanks ASC
OFFSET @RequestedRowIndex-1 FETCH FIRST 1 ROW ONLY
);
RETURN @retval;
END;