Выбор строк, которые физически не существуют в базе данных - PullRequest
1 голос
/ 24 июня 2011

Я полностью переписал свой вопрос, потому что простота предыдущего вопроса воспринималась слишком буквально.

Цель:

INSERT INTO X
SELECT TOP 23452345 NEWID()

Этот запрос должен вставить 23452345 GUID в таблицу «X». фактически 23452345 означает просто любое возможное число, которое вводится пользователем и сохраняется в базе данных.

Итак, проблема в том, что вставка строк в базу данных осуществляется с помощью

INSERT INTO ... SELECT ...

оператор требует, чтобы у вас уже было необходимое количество строк, вставленных в базу данных.

Естественно, вы можете эмулировать существование строк, используя временные данные и перекрестное соединение, но это (по моему глупому мнению) дает больше результатов, чем необходимо, и в некоторых экстремальных ситуациях может быть неудачным по многим непредсказуемым причинам. Я должен быть уверен, что если пользователь введет чрезвычайно большое число, например, 2 ^ 32 или даже больше, система будет работать и вести себя нормально без каких-либо возможных побочных эффектов, таких как чрезмерное потребление памяти / времени и т. Д. *

Ответы [ 5 ]

4 голосов
/ 24 июня 2011

Справедливости ради, я получил идею от этого сайта .

;WITH cte AS
(
  SELECT 1 x
  UNION ALL
  SELECT x + 1
  FROM cte
  WHERE x < 100
)
SELECT NEWID()
FROM cte

РЕДАКТИРОВАТЬ:

Общий метод, который мы видим, это выбрать из таблицыэто имеет желаемое количество строк.Это глупо, но вы можете создать таблицу, вставить нужное количество записей и выбрать из нее.

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
3 голосов
/ 24 июня 2011

Конечно, создание таблицы чисел - лучший подход, который пригодится.Вы обязательно должны иметь один в вашем распоряжении.Если вам нужно что-то одноразовое, просто присоединитесь к известному столу.Я обычно использую системную таблицу, такую ​​как 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 голосов
/ 24 июня 2011

Я бы создал таблицу целых чисел и использовал бы ее. Этот тип стола пригодится во многих ситуациях.

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
1 голос
/ 24 июня 2011

Попробуйте это:

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
0 голосов
/ 24 июня 2011
SELECT TOP 100 NEWID() from sys.all_columns 

Или любой другой источник данных, имеющий большое количество записей. Вы можете создать свою собственную таблицу для подсчета функциональности как таковой, вы можете использовать ее вместо циклов while.

Таблицы подсчета: http://www.sqlservercentral.com/articles/T-SQL/62867

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...