我完全重写了我的问题,因为前一个人的简单性太过于字面上了。
目标:
INSERT INTO X
SELECT TOP 23452345 NEWID()
此查询应将23452345 GUID插入“X”表。实际上,23452345表示用户输入并存储在数据库中的任何可能的数字。
所以问题是使用
将行插入数据库INSERT INTO ... SELECT ...
语句要求您已将所需的行数插入到数据库中。
当然,您可以通过使用临时数据并交叉加入来模拟行的存在,但这(在我的愚蠢观点中)创建的结果超出了需要,并且在某些极端情况下可能由于许多不可预测的原因而失败。我需要确保如果用户输入了极大的数字,如2 ^ 32甚至更大,系统将正常工作并且没有任何可能的副作用,如极端内存/时间消耗等...
答案 0 :(得分:4)
平心而论,我从this site中得出了这个想法。
;WITH cte AS
(
SELECT 1 x
UNION ALL
SELECT x + 1
FROM cte
WHERE x < 100
)
SELECT NEWID()
FROM cte
编辑:
我们看到的一般方法是从具有所需行数的表中进行选择。它是hackish,但您可以创建一个表,插入所需数量的记录,然后从中进行选择。
create table #num
(
num int
)
declare @i int
set @i = 1
while (@i <= 77777)
begin
insert into #num values (@i)
set @i = @i + 1
end
select NEWID() from #num
drop table #num
答案 1 :(得分:3)
当然,创建一个Number表是最好的方法,并且会派上用场。你肯定应该有一个随时可用。如果您需要一些一次性的东西,只需加入一个已知的表。我通常使用系统表,如spt_values:
declare @result table (id uniqueidentifier)
declare @sDate datetime
set @sDate = getdate();
;with num (n)
as ( select top(777777) row_number() over(order by t1.number) as N
from master..spt_values t1
cross join master..spt_values t2
)
insert into @result(id)
select newid()
from num;
select datediff(ms, @sDate, getdate()) [elasped]
答案 2 :(得分:2)
我创建一个整数表并使用它。这种类型的表在很多情况下派上用场。
CREATE TABLE dbo.Integers
(
i INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
)
WHILE COALESCE(SCOPE_IDENTITY(), 0) <= 100000 /* or some other large value */
BEGIN
INSERT dbo.Integers DEFAULT VALUES
END
然后你需要做的就是:
SELECT NEWID()
FROM Integers
WHERE i <= 77777
答案 3 :(得分:1)
试试这个:
with
L0 as (select 1 as C union all select 1) --2 rows
,L1 as (select 1 as C from L0 as A, L0 as B) --4 rows
,L2 as (select 1 as C from L1 as A, L1 as B) --16 rows
,L3 as (select 1 as C from L2 as A, L2 as B) --256 rows
select top 100 newid() from L3
答案 4 :(得分:0)
SELECT TOP 100 NEWID() from sys.all_columns
或具有大量记录的任何其他数据源。您可以构建自己的“计数”功能表,您可以使用它来代替while循环。
Tally tables: http://www.sqlservercentral.com/articles/T-SQL/62867