选择数据库中物理上不存在的行

时间:2011-06-23 20:21:41

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

我完全重写了我的问题,因为前一个人的简单性太过于字面上了。

目标:

INSERT INTO X
SELECT TOP 23452345 NEWID()

此查询应将23452345 GUID插入“X”表。实际上,23452345表示用户输入并存储在数据库中的任何可能的数字。

所以问题是使用

将行插入数据库
INSERT INTO ... SELECT ...

语句要求您已将所需的行数插入到数据库中。

当然,您可以通过使用临时数据并交叉加入来模拟行的存在,但这(在我的愚蠢观点中)创建的结果超出了需要,并且在某些极端情况下可能由于许多不可预测的原因而失败。我需要确保如果用户输入了极大的数字,如2 ^ 32甚至更大,系统将正常工作并且没有任何可能的副作用,如极端内存/时间消耗等...

5 个答案:

答案 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