2011-09-25 65 views
0

我需要将@N行随机float值插入到一个表中,并将每个新插入行的ID用于另一个INSERT。这一切我需要在存储过程中完成。例如:将N个随机值插入表

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 

在此先感谢。

+0

随机漂浮界限之间? '@ N'还有一个最大值,超过这个值你不会去? –

+0

界限无关紧要。例如'@ min'和'@ max'。 '@ N'无限制# –

+0

从实际角度来看,'@ N'会有一个限制。你打算用这个来插入一万亿行吗? –

回答

4

没有循环的形式,一个刀片

;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

@@ gbn:是OPTION(MAXRECURSION 0);需要? –

+1

虽然它不会插入到“T2”? –

+0

@Mitch小麦:好点,非递归CTE不需要。谢谢 – gbn

1

这并不完全清楚你想要做什么。你的意思是这样的:

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 

[我不主张使用循环;这不是最有效的方法。这只是那海报被要求...]

0
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)