Вставить N случайных значений в таблицу - PullRequest
0 голосов
/ 25 сентября 2011

Мне нужно вставить @N строки со случайными float значениями в одну таблицу и использовать идентификаторы каждой новой вставленной строки для другой INSERT. Все это мне нужно сделать в хранимой процедуре. Например:

CREATE PROCEDURE Proc
    @N int
AS

-- START LOOP, REPEAT @N TIMES
INSERT INTO [T1]
    ([Value])
VALES
    (<random_float>)

INSERT INTO [T2]
    ([ValueID])
VALUES
    (@@IDENTITY)
-- END LOOP

END
GO

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 25 сентября 2011

Без петель, одна вставка

;WITH cte AS
(  --there are easier ways to build a numbers table
   SELECT
       ROW_NUMBER() OVER (ORDER BY (select 0)) AS rn
   FROM
      sys.columns c1 CROSS JOIN sys.columns c2 CROSS JOIN sys.columns c3
)
INSERT INTO [T1] ([Value])
OUTPUT INSERTED.ID INTO T2  -- direct insert to T2
SELECT RAND(CHECKSUM(NEWID()))
FROM cte
WHERE rn <= @N;
1 голос
/ 25 сентября 2011
CREATE TABLE [T1]
(
    [ValueID] INT IDENTITY(1,1),
    [Value] FLOAT
)
GO

CREATE TABLE [T2]
(
    [ValueID] INT
)
GO

CREATE PROCEDURE [Proc]
    @N int
AS
BEGIN
    DECLARE @i INT = 0;

    WHILE (@i < @N)
    BEGIN
        INSERT INTO [T1]
            ([Value])
        SELECT RAND()

        INSERT INTO [T2]
            ([ValueID])
        VALUES
            (SCOPE_IDENTITY())

        SET @i += 1
    END
END
GO

TRUNCATE TABLE T1
TRUNCATE TABLE T2
EXEC [Proc] @N = 10

См. WHILE (Transact-SQL) и SCOPE_IDENTITY (Transact-SQL) .

1 голос
/ 25 сентября 2011

Не совсем понятно, что вы пытаетесь сделать.Вы имели в виду что-то вроде этого:

create table dbo.RandomTable
( 
    rowid int not null PRIMARY KEY,        
    pure_random float null,
)

declare @row int
set @row = 1
while (@row <= @N)
begin
   insert into dbo.RandomTable (rowid, pure_random)
   values (@row, rand())
   set @row = @row + 1
end

[Я не защищаю использование цикла;это не самый эффективный способ сделать это.Это просто та форма, которую просил плакат ...]

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