SQL 服务器获取序列的多个下一个值
SQL Server get multiple next values for sequence
在 SQL 服务器中,您可以 select 来自如下序列的下一个值:
select next value for MY_SEQ
如果您不抑制 table 从中到 select,对于每一行,将输出下一个值:
select next value for MY_SEQ
from MY_TABLE
[2020-09-08 15:47:34] 350 rows retrieved starting from 1 in 102 ms (execution: 62 ms, fetching: 40 ms)
如何 select 序列的下一个 n
值?
在 Oracle 中,这看起来像这样:
select MY_SEQ.nextval
from (
select level
from dual
connect by level < 10
)
我试过这样的事情:
select top(10) next value for MY_SEQ
但结果是:
[S0001][11739] NEXT VALUE FOR function cannot be used if ROWCOUNT option has been set, or the query contains TOP or OFFSET.
我想我可以创建一个包含 n
行和 select 的临时 table,但这不是一个特别优雅的解决方案。
您可以在获取序列值之前提取正确的行数
DECLARE @N INT = 100;
SELECT next value FOR MY_SEQ
FROM (
SELECT 1 X
FROM FN_NUMBERS(@N)
) X
CREATE FUNCTION [dbo].[FN_NUMBERS](
@MAX INT
)
RETURNS @N TABLE (N INT NOT NULL PRIMARY KEY)
BEGIN
WITH
Pass0 as (select '1' as C union all select '1'), --2 rows
Pass1 as (select '1' as C from Pass0 as A, Pass0 as B),--4 rows
Pass2 as (select '1' as C from Pass1 as A, Pass1 as B),--16 rows
Pass3 as (select '1' as C from Pass2 as A, Pass2 as B),--256 rows
Pass4 as (select TOP (@MAX) '1' as C from Pass3 as A, Pass3 as B) --65536 rows
,Tally as (select TOP (@MAX) '1' as C from Pass4 as A, Pass2 as B, Pass1 as C) --4194304 rows
--,Tally as (select TOP (@MAX) '1' as C from Pass4 as A, Pass3 as B) --16777216 rows
--,Tally as (select TOP (@MAX) '1' as C from Pass4 as A, Pass4 as B) --4294836225 rows
INSERT INTO @N
SELECT TOP (@MAX) ROW_NUMBER() OVER(ORDER BY C) AS N
FROM Tally
RETURN
END
您可以简单地使用 sys.objects
而不是计数 table
SELECT next value FOR MY_SEQ
FROM (
SELECT TOP (@N) 1 X
FROM sys.objects o1, sys.objects o2, sys.objects o3
) X
我认为您正在寻找系统存储过程'sp_sequence_get_range'
要从序列中获取接下来的 10 个值,它会像这样
DECLARE @range_first_value_output sql_variant ;
EXEC sys.sp_sequence_get_range
@sequence_name = N'MY_SEQ'
, @range_size = 10
, @range_first_value = @range_first_value_output OUTPUT ;
SELECT @range_first_value_output AS FirstNumber;
为什么不直接用下一个值填充 table 变量?
declare @next_values table (next_value int)
declare @i int = 1
while @i <= 10
begin
insert into @next_values (next_value)
select next value for MY_SEQ from MY_TABLE
set @i = @i + 1
end
-- We return those values
select * from @next_values
在 SQL 服务器中,您可以 select 来自如下序列的下一个值:
select next value for MY_SEQ
如果您不抑制 table 从中到 select,对于每一行,将输出下一个值:
select next value for MY_SEQ
from MY_TABLE
[2020-09-08 15:47:34] 350 rows retrieved starting from 1 in 102 ms (execution: 62 ms, fetching: 40 ms)
如何 select 序列的下一个 n
值?
在 Oracle 中,这看起来像这样:
select MY_SEQ.nextval
from (
select level
from dual
connect by level < 10
)
我试过这样的事情:
select top(10) next value for MY_SEQ
但结果是:
[S0001][11739] NEXT VALUE FOR function cannot be used if ROWCOUNT option has been set, or the query contains TOP or OFFSET.
我想我可以创建一个包含 n
行和 select 的临时 table,但这不是一个特别优雅的解决方案。
您可以在获取序列值之前提取正确的行数
DECLARE @N INT = 100;
SELECT next value FOR MY_SEQ
FROM (
SELECT 1 X
FROM FN_NUMBERS(@N)
) X
CREATE FUNCTION [dbo].[FN_NUMBERS](
@MAX INT
)
RETURNS @N TABLE (N INT NOT NULL PRIMARY KEY)
BEGIN
WITH
Pass0 as (select '1' as C union all select '1'), --2 rows
Pass1 as (select '1' as C from Pass0 as A, Pass0 as B),--4 rows
Pass2 as (select '1' as C from Pass1 as A, Pass1 as B),--16 rows
Pass3 as (select '1' as C from Pass2 as A, Pass2 as B),--256 rows
Pass4 as (select TOP (@MAX) '1' as C from Pass3 as A, Pass3 as B) --65536 rows
,Tally as (select TOP (@MAX) '1' as C from Pass4 as A, Pass2 as B, Pass1 as C) --4194304 rows
--,Tally as (select TOP (@MAX) '1' as C from Pass4 as A, Pass3 as B) --16777216 rows
--,Tally as (select TOP (@MAX) '1' as C from Pass4 as A, Pass4 as B) --4294836225 rows
INSERT INTO @N
SELECT TOP (@MAX) ROW_NUMBER() OVER(ORDER BY C) AS N
FROM Tally
RETURN
END
您可以简单地使用 sys.objects
SELECT next value FOR MY_SEQ
FROM (
SELECT TOP (@N) 1 X
FROM sys.objects o1, sys.objects o2, sys.objects o3
) X
我认为您正在寻找系统存储过程'sp_sequence_get_range'
要从序列中获取接下来的 10 个值,它会像这样
DECLARE @range_first_value_output sql_variant ;
EXEC sys.sp_sequence_get_range
@sequence_name = N'MY_SEQ'
, @range_size = 10
, @range_first_value = @range_first_value_output OUTPUT ;
SELECT @range_first_value_output AS FirstNumber;
为什么不直接用下一个值填充 table 变量?
declare @next_values table (next_value int)
declare @i int = 1
while @i <= 10
begin
insert into @next_values (next_value)
select next value for MY_SEQ from MY_TABLE
set @i = @i + 1
end
-- We return those values
select * from @next_values